2014년 7월 10일 목요일

Static SQL & Dynamic SQL

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;
 
# 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)

댓글 없음:

댓글 쓰기