4. Static SQL 과 Dynamic SQL
* Stack SQL과 Dynamic SQL의 가장 큰 차이점은 Precompile 과정 처리 여부이다.
# Static SQL(Embedded SQL) 이란?
- String 변수에 담지 않고 코드 사이에 직접 기술한 SQL문
- Pro*C, SQLJ, APRE,
- Static
SQL 작성하여 compile 하면 Precompiler가 작동하는데 순수 C/C++ 코드와 SQL문을 분리하고, 다시
C/C++을 compile 하여 생성된 binary 형식의 실행파일을 실행함. 알티베이스의 경우 위 과정을 APRE라는 명령어로
한꺼번에 수행함.
- Precompile 단계에서는 parse 과정(구문 분석, 유효 오브젝트 여부, 오브젝트 여부, 오브젝트 액세스 권한 체크)을 거친다.
<예시>
EXEC SQL CONNECT :usr IDENTIFIED BY :pwd USING :conn_opt;
EXEC SQL SELECT DNAME, DEP_LOCATION INTO :s_dname, :s_dep_location
FROM DEPARTMENTS WHERE DNO = :s_dno;
FROM DEPARTMENTS WHERE DNO = :s_dno;
# Dynamic SQL 이란?
- String형 변수에 담아서 기술하는 SQL문
- JAVA, Visual Basic, SQL 개발 툴(Orange, Toad, SQL *PLUS, 알티베이스의 isql
- 동적으로 바뀔 수도 있고, Runtime시에 사용자로부터 SQL문의 일부 또는 전부를 입력 받아서 실행하므로,
Precompile 단계에서는 parse 과정(구문 분석, 유효 오브젝트 여부, 오브젝트 여부, 오브젝트 액세스 권한 체크)을 생략함.
< 예시 >
- APRE
strcpy(query, "delete from employees where eno = ? and e_lastname = ?");
EXEC SQL PREPARE S FROM :query;
EXEC SQL EXECUTE S USING :s_eno, :s_elastname;
- JAVA
String sql = "select ZLOCAMT_1, ZLOCAMT_2, BILL_QTY from EP_ODS.ODS_AZEP_O0500 limit 20";
ResultSet sRS;
PreparedStatement pstmt = sCon.prepareStatement(sql);
sRS=pstmt.executeQuery();
while( sRS.next() )
{
pstmt.setFloat( 1, sRS.getFloat(1) );
pstmt.setFloat( 2, sRS.getFloat(2) );
pstmt.setFloat( 3, sRS.getFloat(3) );
pstmt.execute();
}
/* Finalize process */
pstmt.close();
sCon.close();
<비교테스트>
- Static SQL 작성시 SQL 문을 잘못 작성한 경우
EXEC SQL DELET FROM EMPLOYEES
WHERE ENO > :s_eno AND DNO > :s_dno AND EMP_JOB LIKE 'P%';
[wonsik@as48-x64 APRE]$ make delete
apre -t cpp delete.sc
-----------------------------------------------------------------
Altibase C/C++ Precompiler.
Release Version 6.3.1.0.7
Copyright 2000, ALTIBASE Corporation or its subsidiaries.
All Rights Reserved.
-----------------------------------------------------------------
[ERR-000H : parse error, unexpected TR_FROM, expecting TR_FOR] <---- parse 단계에서 오류 발생
File : delete.sc
Line : 43
Offset: 20-23
Error_token:FROM
make: *** [delete.cpp] Error 1
- DYNAMIC SQL 작성시 SQL문을 잘못 작성한 경우
strcpy(query, "delet from employees where eno = ? and e_lastname = ?");
[wonsik@as48-x64 APRE]$ make dynamic2
apre -t cpp dynamic2.sc
-----------------------------------------------------------------
Altibase C/C++ Precompiler.
Release Version 6.3.1.0.7
Copyright 2000, ALTIBASE Corporation or its subsidiaries.
All Rights Reserved.
-----------------------------------------------------------------
g++ -D_GNU_SOURCE -D_GNU_SOURCE -W -Wall -pipe -D_POSIX_PTHREAD_SEMANTICS -D_POSIX_THREADS -D_POSIX_THREAD_SAFE_FUNCTIONS -D_REENTRANT -DPDL_HAS_AIO_CALLS -m64 -mtune=k8 -O3 -funroll-loops -fno-strict-aliasing -DPDL_NDEBUG -fno-implicit-templates -Wno-deprecated -fno-exceptions -fcheck-new -D__PDL_INLINE__ -rdynamic -DPDL_LACKS_PDL_TOKEN -DPDL_LACKS_PDL_OTHER -DACP_CFG_COMPILE_64BIT -DACP_CFG_COMPILE_BIT=64 -DACP_CFG_COMPILE_BIT_STR=64 -c -I/home/wsalti/altibase_home/include -I. -o dynamic2.o dynamic2.cpp
g++ -Wl,-relax -L. -O3 -L/home/wsalti/altibase_home/lib -o dynamic2 dynamic2.o -lapre -lodbccli -ldl -lpthread -lcrypt -lrt
------> 컴파일 성공적으로 수행, 프리컴파일 단계에서 SQL을 parsing 하지 않는다.
[wonsik@as48-x64 APRE]$ ./dynamic2
------------------------------------------------------------------
[Prepare]
------------------------------------------------------------------
Error : [-200705] SQL syntax error
line 1: parse error
DELET from employees where eno = ? and e_lastname = ? <----- Runtime 시 에러 발생
^ ^
------------------------------------------------------------------
[Execute]
------------------------------------------------------------------
Error : [-589858] The statement does not exist. (Name:S)
댓글 없음:
댓글 쓰기