본문 바로가기

ORACLE

ORACLE DBMS_SQL v1.0

ORACLE DBMS_SQL #1

 

from Beginning Oracle Programming | 정보문화사

 

1.    ORACLE DBMS_SQL

8i 이전엔 동적 SQL을 만드는 유일한 방법이었다고 함. 현재는 EXECUTE IMMEDIATE 를 사용해 동적인 SQL을 실행하는게 가능해졌다.

 

2.    DBMS_SQL 의 실행흐름

A.     OPEN CURSOR

B.     EVALUATE SYNTAX, SEMANTICS

C.     BINDING (OPTIONAL)

D.     EXECUTE

E.     RETURN RESULTS

F.      CLOSE CURSOR

 

RESULT는 수행되는 SQL문이 QUERY인가 아닌가에 따라 내용이 다르다.

QUERY가 아닌 경우 리턴된 값을 로컬 변수에 연결하며

(UPDATE 경우를 생각하면 몇 개의 행이 UPDATE 되었다 란 내용)

QUERY인 경우 결과 값을 로컬 저장공간에 저장한다.

 

SQL 의 수행을 PARSE (BIND) EXECUTE FETCH 로 생각했을 때 위의 흐름 역시

SQL 수행 흐름과 동일하게 볼 수 있다.

 

3.    BIND_VARIABLE() BIND_ARRAY()

두 메소드의 차이는 BIND를 한번에 하느냐 마느냐란 차이다.

 

<<BIND_VARIABLE() 의 경우>>

declare

        l_cursor number := dbms_sql.open_cursor;

        l_ignore number;

begin

        dbms_sql.parse(l_cursor,'select /*+ ### */ :a,:b from dual',dbms_sql.native);

        --start binding1

        dbms_sql.bind_variable(l_cursor,':A',1);

        dbms_sql.bind_variable(l_cursor,':B','Hello');

        --end binding1

        l_ignore := dbms_sql.execute(l_cursor);

             --start binding2

        dbms_sql.bind_variable(l_cursor,':A',2);

        dbms_sql.bind_variable(l_cursor,':B','Hi');

             --end binding2

        l_ignore := dbms_sql.execute(l_cursor);

        dbms_sql.close_cursor(l_cursor);

end;

       /

 

<<BIND_ARRAY() 의 경우>>

 

declare

        l_cursor number := dbms_sql.open_cursor;

        l_ignore number;

       

        --bind_variable()

        l_num dbms_sql.number_table;

        l_var dbms_sql.varchar2_table;

begin

        dbms_sql.parse(l_cursor,'select /*+ ### */ :a,:b from dual',dbms_sql.native);

        --start integrated binding

        l_num(1) := 1;

        l_num(2) := 2;

        l_var(1) := 'Hello';

        l_var(2) := 'Hi';

        dbms_sql.bind_array(l_cursor, ':A',l_num);

        dbms_sql.bind_array(l_cursor, ':B',l_var);

        --end integrated binding

        l_ignore := dbms_sql.execute(l_cursor);

        dbms_sql.close_cursor(l_cursor);

end;

/

 

 

4.    DBMS_SQL METHOD 설명

뒤늦게 설명을 하게 되었지만 실질적인 예(위의…)를 가지고 이야기 하는게 쉽다.

위의 (익명)프로시저는 에러없이 정상적인 수행이 가능했고 이가 의미하는 바는

최소한의 필수적인 내용이 다 들어가 있다는 것과 동일하다.

/*+ 필수적인 내용이 무엇인지 확인… */

 

A.     OPEN_CURSOR

작업영역을 지정.

B.     PARSE( CURSOR, SQL_QUERY, LANGUAGE_FLAG)

LANGUAGE_FLAG ORACLE SQL 구문을 다룰 방법을 지정하는 것

-      DBMS_SQL.V6

-      DBMS_SQL.V7

-      DBMS_SQL.NATIVE 로 지정 가능 /*+ 차이에 대해 내용추가 */

C.     BIND_VARIABLE( CURSOR, BIND_NAME, REAL_VALUE ) (optional)

BIND_NAME 은 대문자로 대응된다.

D.     BIND_ARRAY( CURSOR, BIND_NAME, VALUE_TABLE ) (optional)

DECLARE 부분을 보면 NUMBER_TABLE VARCHAR2_TABLE 을 사용한 것을

볼 수 있다. 이 밖에도 데이터 타입별로 TABLE 이 구비되어있고 BIND_ARRAY

DECLARE 절에 정의했던 테이블 변수를 입력값으로 사용하게 된다.

E.     EXECUTE( CURSOR )

커서를 실행한다. INSERT, UPDATE, DELETE 의 경우 결과값 몇 개의 행이 ???

되었다란 결과를 출력하고 QUERY의 경우 0이 반환된다.

F.      CLOSE_CURSOR( CURSOR)

CURSOR CLOSE