Kori 4월 10일, 2022에 포스트됨 공유하기 4월 10일, 2022에 포스트됨 Docwiki에 있는 "Preprocessing Command Text (FireDAC)"을 번역한 글: 번역일: 2022년 4월 10일) 위로 가기: [DocWiki 번역] 명령(command)을 가지고 작업하기 (FireDAC) 목차 1 주제 (Topics) 2 일반 (General) 3 SQL 사투리 추상화 (SQL Dialect Abstraction) 4 대체 변수 (Substitution Variables) 5 파라미터 표시자 (Parameter Markers) 6 이스케이프 시퀀스 (Escape Sequences) 7 조건부 대체 (Conditional Substitution) 8 특수 문자 전처리하기 (Special Character Processing) 9 기타 참조 (See Also) 9.1 예제 (Sample) 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와 MacroExpand가 True이어야 한다. 5 파라미터 표시자 (Parameter Markers) 파라미터 표시자는 ':' 심볼 뒤에 파라미터 이름이 붙는 형태이다. 예를 들면, SELECT * FROM Orders WHERE OrderDate > :FROM_DATE '?' 심볼은 이름이 지정되지 않은(unnamed) 파라미터 지시자로 인식되며, 데이터 스냅(DataSnap) 호환성을 위한 것이므로 일반 FireDAC 애플리케이션에서는 사용하면 안된다. 이 파라미터를 사용하는 방법을 자세히 보려면, "명령(command) 실행하기"에서 "파라미터 사용하기" 부분을 참고한다. 파라미터가 처리되려면 ResourceOptions.ParamCreate과 ParamExpand가 True이어야 한다. 6 이스케이프 시퀀스 (Escape Sequences) FireDAC에는 아래 5가지 이스케이프 시퀀스 (Escape sequences) 유형이 있다. 상수(constant) 대체 허용 식별자(identifier) 대체 허용 조건부 대체 LIKE 연산자 이스케이프 시퀀스 (Escape sequences) 스칼라(Scalar) 함수 이스케이프 시퀀스 (Escape sequences)가 처리되려면 ResourceOptions.EscapeExpand가 True이어야 한다. 상수(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로 전송하려면, 다음과 같이 한다. 특수 문자를 중복 표기 (예: ‘{{’) MySQL에서는, 특수 문자 앞에 ‘\’ 문자 배치 (예: ‘\”’) '!', '&', '{', '}'인 경우에는, ResourceOptions.MacroCreate, MacroExpand, EscapeExpand를 False로 지정. ':', '?'인 경우에는, ResourceOptions.ParamCreate, ParamExpand를 False로 지정. 그렇지 않으면, '!', '&', '{', '}' 문자는 매크로 명령으로 처리되고, ':', '?'는 파라미터 표시자로 처리된다. FireDC에서 구성을 감지하는 다음 경우에는 파라미터 표시자로 처리하지 않는다. Oracle PL/SQL 할당 연산자. Firebird EXECUTE BLOCK 파라미터가 BEGIN … END 안에 있을 때. TSQL 레이블. PostgreSQL과 Informix에서 '::' 캐스트(cast) 연산자. Informix에서 ':' 카탈로그 구분자 (catalog separator). 9 기타 참조 (See Also) 오브젝트 이름 (Object Names) 9.1 예제 (Sample) FireDAC TFDTableAdapter Main 예제 FireDAC TFDQuery Macros 예제 FireDAC IFDPhysCommand Macros 예제 FireDAC IFDPhysCommand Escape Functions 예제 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.