Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[DocWiki 번역] 명령 텍스트 전처리하기 (FireDAC)


Recommended Posts

Docwiki에 있는 "Preprocessing Command Text (FireDAC)"을 번역한 글: 번역일: 2022년 4월 10일)

위로 가기: [DocWiki 번역] 명령(command)을 가지고 작업하기 (FireDAC)

목차


 

1 주제 (Topics)

주제 설명
문자 매크로 함수 문자열 (character strings)을 다루는 함수 목록
숫자 매크로 함수 숫자를 다루는 함수 목록
날짜와 시간 매크로 함수 날짜와 시간을 다루는 함수 목록
시스템 매크로 함수 특수 함수 목록
변환 매크로 함수 CONVERT 함수 설명
RETURNING 지원 일원화 FireDAC은 Firebird, Oracle, PostgreSQL의 RETURNING 절을 지원한다.

 

2 일반 (General)

이 문서 여러 곳에서 "매크로(macro)"와 "이스케이프 시퀀스(escape sequence)"가 혼용되고 있는데 둘다 같은 의미이다. FireDAC이 지원하는 매크로 명령을 3가지 유형이 있다.

  • 대체 변수 (Substitution variables): 명령(command) 텍스트 안에 파라미터를 넣어두어서, 파라미터에 값을 사용할 수 있게 확장할 수 있다. 예를 들면, FROM 절에서 사용할 테이블 이름을 파라미터화하거나 SELECT 절에서 사용할 컬럼 이름을 파라미터화 해두고, 실제로는 대체 변수 값이 파라미터 자리에 들어가도록 할 수 있도록 한다.
  • 이스케이프 시퀀스 (Escape sequences): 특정 DBMS에 종속되지 않으며, 일원화된 구문으로 SQL  명령(command)을 작성할 수 있도록 한다.
  • 조건부 대체 (Conditional substitutions): SQL 명령(command)을 조건에 맞게 확장할 수 있도록 한다. 이때 애플리케이션에서 정의한 속성이나 현재 연결된 DBMS에 따라 내용이 결정된다.

ResourceOptions.MacroCreate 프로퍼티가 True로 지정되어 있을 때,  CommandText 또는 SQL 프로퍼티에 값을 지정하면 Macros 컬렉션 프로퍼티가 자동으로 채워진다.  Prepare 메소드를 호출할 때, ResourceOptions.MacroExpand가 True이면, FireDAC의 명령 전처리기는 명령문(command text)을 해당 DBMS에서 이해할 수 있는 형태로 변환한다. 즉 DBMS에서는 매크로가 보이지 않는다.

ResourceOptions.ParamCreate 프로퍼티의 값이 True일 때, Params 컬렉션 프로퍼티는 자동으로 채워진다.   Prepare 메소드를 호출할 때, ResourceOptions.ParamExpand가 True이면, FireDAC은 파라미터 표시자를 해당 DBMS의 네이티브한 표시자로 교체한다.

이스케이프 시퀀스(escape sequence)와 조건부 대체 (Conditional substitutions)가 처리되려면 ResourceOptions.EscapeExpand가 True이어야 한다.

 

3 SQL 사투리 추상화 (SQL Dialect Abstraction)

애플리케이션에서 여러 가지 DBMS를 지원할 필요가 있다면, DBMS 별로 SQL 표준이 아닌 저마다  고유한 SQL 구문이 있을 수 있기 때문에, DBMS에 따라 SQL 구문이 서로 다를 수 있다는 점을 명심해야 한다. FireDAC의 이스케이프 시퀀스 (Escape sequences)는 특정 DBMS에 종속되지 않으며, 일원화된 구문으로 SQL  명령(command)을 작성할 수 있도록 한다.

예를 들면, 문자열을 대문자로 변환하는 함수는 MySQL, Oracle, MS-SQL 서버에서 각기 다르다. 하지만, 다음과 같이 작성된 FireDAC 명령은 어느 DBMS에서도 모두 작동한다.

SELECT {ucase(Name)} FROM MyTable

주의, SQLite에서 사용하려면 FireDAC.Stan.ExprFuncs 유닛을 "uses" 절에 추가해야 한다. 보다 복잡한 경우에서 명령의 일부 또는 명령문 전체를 DBMS별로 다르게 써야 한다면, FireDAC의  조건부 대체 (Conditional substitutions)가 도움이 된다.

{IF Oracle} SELECT * FROM OracleTab {fi}
{IF MSSQL} SELECT * FROM MSSQLTab {fi}

 

4 대체 변수 (Substitution Variables)

대체 변수 (substitution variable)는 ‘!’ 또는 ‘&’ 심볼 뒤에 매크로 변수 이름이 붙는 형태이다. 예를 들면, 

SELECT * FROM &TabName

심볼의 의미는 다음과 같다.

  • !’--“문자열(string)” 대체 모드. 매크로 변수의 값이 “있는 그대로” 바로 명령문 안에 들어가고 그 이외의 변형은 없다.
  • &’-–“SQL” 대체 모드. 매크로 변수의 값으로 대체되는데, 타겟 DBMS 구문 규칙을 사용하여 매크로 데이터 타입에 알맞게 대체된다.

매크로 사용 방법은 다음 코드 조각을 참조한다.

FDQuery1.SQL.Text := 'SELECT * FROM &TabName';
FDQuery1.MacroByName('TabName').AsRaw := 'Orders';
FDQuery1.Open;

매크로가 처리되려면 ResourceOptions.MacroCreate와 MacroExpandTrue이어야 한다.

 

5 파라미터 표시자 (Parameter Markers)

파라미터 표시자는 ':' 심볼 뒤에 파라미터 이름이 붙는 형태이다. 예를 들면,

SELECT * FROM Orders WHERE OrderDate > :FROM_DATE

'?' 심볼은 이름이 지정되지 않은(unnamed) 파라미터 지시자로 인식되며, 데이터 스냅(DataSnap) 호환성을 위한 것이므로 일반 FireDAC 애플리케이션에서는 사용하면 안된다.

이 파라미터를 사용하는 방법을 자세히 보려면, "명령(command) 실행하기"에서 "파라미터 사용하기" 부분을 참고한다. 파라미터가 처리되려면 ResourceOptions.ParamCreate과 ParamExpandTrue이어야 한다.

 

6 이스케이프 시퀀스 (Escape Sequences)

FireDAC에는 아래 5가지 이스케이프 시퀀스 (Escape sequences) 유형이 있다.

  • 상수(constant) 대체 허용
  • 식별자(identifier) 대체 허용
  • 조건부 대체
  • LIKE 연산자 이스케이프 시퀀스 (Escape sequences)
  • 스칼라(Scalar) 함수

이스케이프 시퀀스 (Escape sequences)가 처리되려면 ResourceOptions.EscapeExpandTrue이어야 한다.

상수(constant) 대체 이스케이프 시퀀스를 사용하면 명령문 안에서 상수를 써넣을 수 있다. 이때 DBMS 고유한 문법이나 지역 설정 등에 영향을 받지 않는다. 다음 표를 보면  상수(constant) 대체 이스케이프 시퀀스가 특정 DBMS 구문으로 어떻게 변환되는지를 알 수 있다.

형식 설명
{e <숫자>} 숫자 상수. <숫자>에서 소숫점은 반드시 '.'를 사용해야 한다.
예를 들면, {e 123.7} -> MSAccess에서는 123,7 이 된다.
{d <날짜>} 날짜 상수. <날짜>는 반드시  'yyyy-mm-dd' 형식이어야 한다.
예를 들면, {d 2004-08-30} -> 오라클에서는 TO_DATE('2004-08-30', 'yyyy-mm-dd')이 된다.
{t <시간>} 시간 상수. 반드시  'hh24:mi:ss' 형식으로 명시해야 한다.
예를 들면, {t 14:30:00} -> MS-SQL 서버에서는 CONVERT(DATETIME, '14:30:00', 114)이 된다.
{dt <날짜 & 시간>} 날짜와 시간 상수. <날짜 & 시간>은 반드시 위의 형식으로 명시되어야 한다.
{l <불리언(boolean)>} 불리언(boolean) 상수. <불리언(boolean)>은 False 또는 True이다. 불리언 데이터 타입을 지원하는 DBMS에서는 이스케이스 시퀀스가 해당 타입 상수로 확장된다. 지원하지 않는 DBMS에서는 숫자 값 0 또는 1로 확장된다.
{s <문자열(string)>} 문자열(string) 상수. <문자열(string)> 안에 따옴표로 문자들을 묶을 수도 있고 아닐 수도 있다. 
예를 들면,  {s Company '1st Coding'} -> 'Company 1st Coding'이 된다.

 

식별자(identifier) 대체 허용 이스케이프 시퀀스를 사용하면 DBMS별 고유한 식별자 따옴표 규칙을 추상화할 수 있다. 자세한 내용은  "Object Names"를 참고한다. 구문은 다음과 같다.

형식 설명
{id <식별자 이름>} 확장될 때 DBMS별 고유한 식별자 따옴표 규칙을 반영한다.
예를 들면, {id Order Details} -> Oracle에서는 “Order Details”가 된다. 

 

이스케이프  함수 시퀀스 (escape function sequence)를 사용하면 DBMS별 고유한 내장 함수와 구문(syntax)을 추상화할 수 있다. 구문은 다음과 같다.

형식 설명
{fn <함수 이름>(
<아규먼트들>)}
이스케이프  함수 구문(syntax)과 세트는 ODBC 이스케이프 함수와 동일하다. FireDAC 이스케이프 함수 목록은 하위 주제에 있다.

예를 들면, SELECT * FROM MyTab WHERE Year = {fn YEAR({fn NOW()}} 또는 SELECT * FROM MyTab WHERE Year = {YEAR({NOW()}} -> Oracle에서는 SELECT * FROM MyTab WHERE Year = TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY'))가 된다.

{<함수 이름(<아규먼트들>)} 위와 같음

 

7 조건부 대체 (Conditional Substitution)

조건부 대체 (Conditional substitutions) 이스케이프 시퀀스 (Escape sequences)를 사용하면, 애플리케이션이 연결한 DBMS가 무엇인가에 따라서 또는 매크로 값이 무엇인가에 따라서 알맞게 명령문 안에서 텍스크를 대체할 수 있다. 구문(syntax)도 다르지만, 이 구성은 파라미터와 매크로를 다루는 방식도 다르다. 구문은 다음과 같다.

형식 설명
{iif (X1, Y1, …, XN, YN, YN+1) } 여기에서 Xi는 다음 중 하나이다:
  • DBMS 식별자. 따라서 애플리케이션이 DBMS에 연결되면, 명령문 안에서 해당 Yi의 텍스트로 대체된다.
  • 매크로 변수. 변수의 값이 비어있지 않으면, 명령문 안에서 텍스트 Yi로 대체된다.
어느 조건에도 맞지 않고 YN+1 텍스트가 명시되어 있으면, 이것으로 명령문 안에서 대체된다. Xi와 Yi 안에 있는 파라미터와 매크로는 Params와 Macros 컬렉션 안에 생성된다.
{if x} y {fi} 여기에서 X는 다음 중 하나이다:
  • DBMS 식별자. 따라서 애플리케이션이 DBMS에 연결되면, 명령문 안에서 Y의 텍스트로 대체된다.
  • 매크로 변수. 변수의 값이 비어있지 않으면, 명령문 안에서 텍스트 Y로 대체된다.
X가 True인 경우에만 Y 안에 있는 파라미터와 매크로가 Params와 Macros 컬렉션 안에 생성된다.

 

FireDAC의 DBMS 식별자는 대소문자를 가리지 않으며, 식별자 목록은 다음과 같다.

식별자(Identifier) DBMS
ADS Advantage Database Server
ASA Sybase SQL Anywhere
DB2 IBM DB2
FIREBIRD Firebird
INFORMIX Informix
INTRBASE InterBase
MSACCESS
MSACC
Microsoft Access 데이터베이스
MSSQL Microsoft SQL 서버
MYSQL MySQL 서버
ORACLE
ORA
Oracle 서버
기타 기타 이 표에 없는 DBMS
POSTGRESQL
PG
PostgreSQL 서버
SQLITE SQLite 데이터베이스
TDATA
TERADATA
Teradata 데이터베이스

예를 들어,

{iif (Oracle, TO_CHAR, MSSQL, CONVERT)}          -> Oracle에서는 TO_CHAR’, MS-SQL 서버에서는‘CONVERT’.
{iif (&v1, Me, &v2, You, We)}                   ->  &v1 값이 비어있지 않으면‘Me’, &v2 값이 비어있지 않으면‘you’, 그외라면‘We’.
{if Oracle} TO_CHAR {fi} {if MSSQL} CONVERT {fi} -> Oracle에서는 TO_CHAR’, MS-SQL 서버에서는‘CONVERT’.
{if &v1} Me {fi} {if &v2} You {fi}              -> &v1 값이 비어있지 않으면‘Me’, &v2 값이 비어있지 않으면‘you’.

 

주의, 이스케이프 함수(escape functions)인 IF/IIF에는 같은 이름들이 있다. 조건부 대체에서 함수를 구분하려면, {fn IF(...)} 또는 {fn IIF(...)} 구문을 사용한다.

 

8 특수 문자 전처리하기 (Special Character Processing)

특수 문자인  ‘!’, ‘&’, ‘:’, '?', ‘{’, ‘}’ 등을 DBMS로 전송하려면, 다음과 같이 한다.

 

그렇지 않으면, '!', '&', '{', '}' 문자는 매크로 명령으로 처리되고,  ':', '?'는 파라미터 표시자로 처리된다. 

FireDC에서 구성을 감지하는 다음 경우에는 파라미터 표시자로 처리하지 않는다.

  • Oracle PL/SQL 할당 연산자.
  • Firebird EXECUTE BLOCK 파라미터가 BEGIN … END 안에 있을 때.
  • TSQL 레이블.
  • PostgreSQL과 Informix에서 '::' 캐스트(cast) 연산자.
  • Informix에서 ':' 카탈로그 구분자 (catalog separator).

 

9 기타 참조 (See Also)

 

9.1 예제 (Sample)

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.