본문 바로가기

DataBase/Oracle

[펌]EXECUTE IMMEDIATE를 이용한 Dynamic SQL

1. EXECUTE IMMEDIATE를 이용한 Dynamic SQL 


Oracle 8i에서의 Dynamic SQL은 두가지 방법이 있습니다.

첫번째 방법은  "EXECUTE IMMEDIATE" 절을 사용하여 embedded dynamic sql을 구현하는
방법이고,

두번째 방법은 선언되어지는 것 대신에 실행시에 문장을 보내는 ref cursor의 확장된 개념으로
query를 위해 사용되어지는 방법 입니다.


여기서는 EXECUTE IMMEDIATE를 이용한 Dynamic SQL에 대해서 알아보겠습니다.

[Syntax]

        EXECUTE IMMEDIATE dynamic_sql_string
            [INTO {define_var1 [, define_var2] ... | plsql_record }]
            [USING [IN | OUT | IN OUT] bind_arg1 [,
                        [IN | OUT | IN OUT] bind_arg2] ...];

 


2. 간단하게 테이블을 생성하는 예제 입니다

 
첫번째 예제는 간단하게 테이블을 생성하는 예제 입니다.
 
==========================================================

CREATE OR REPLACE PROCEDURE dynamic_sql_01
IS

    str varchar2(200);

BEGIN

    str := 'CREATE TABLE  total (total number)';
    EXECUTE IMMEDIATE str;

END;

==========================================================

프로시저가 생성되었습니다.

 
-- 프로시저를 실행해서 테이블을 생성 합니다.
SQL> EXEC dynamic_sql_01;
PL/SQL 처리가 정상적으로 완료되었습니다.
 
 
-- 생성된 테이블을 확인해 봅니다.
SQL> DESC total;
 이름                                      널?      유형
 ----------------------------------------- -------- -----------
 TOTAL                                              NUMBER

 

* 프로시저 생성시 "ORA-01031: 권한이 불충분합니다" 에러가 발생하면
  system유저로 접속을 해서 EXECUTE IMMEDIATE를 실행하는 유저에게
  CREATE ANY TABLE 권한을 부여 합니다.  

SQL> CONN system/manager 
SQL> GRANT create any table TO scott;

 


3. 테이블 생성 후 INSERT 예제


두번째 예제는 TABLE_ROWS라는 테이블을 생성하고, 다이나믹 하게 테이블명을 입력하면
테이블명과 테이블에 등록된 데이터수를 TABLE_ROWS에 INSERT하고 출력하는 예제 입니다.


===============================================================

CREATE OR REPLACE PROCEDURE dynamic_sql_02
 (v_table_name IN VARCHAR2)
IS
  
    v_str VARCHAR2(200);
    v_cnt NUMBER;
    v_temp VARCHAR2(50);
   
    CURSOR cur_exists IS
    SELECT TABLE_NAME
    FROM USER_TABLES
    WHERE table_name = 'TABLE_ROWS';
   
BEGIN
   
    OPEN cur_exists
    FETCH cur_exists INTO v_temp;
   

   -- 테이블이 존재하면 테이블을 삭제 합니다.
    IF  cur_exists%FOUND THEN    
        v_str := 'DROP TABLE  table_rows';
        EXECUTE IMMEDIATE v_str;
    END IF;   

    -- 테이블 생성
    v_str := 'CREATE  TABLE  table_rows (total number, table_name varchar2(50))';
    EXECUTE IMMEDIATE v_str;   


   -- 데이터 카운트 조회
    v_str := 'SELECT COUNT(*) cnt FROM '||v_table_name ;
    EXECUTE IMMEDIATE v_str INTO v_cnt ;


    -- 데이터 insert
    v_str := 'INSERT INTO table_rows  VALUES ('||v_cnt||', :A1 )';  
    EXECUTE IMMEDIATE v_str USING v_table_name;


    DBMS_OUTPUT.PUT_LINE(' 테이블 명 : '||v_table_name||'  데이터 수 : '||v_cnt);   

    CLOSE cur_exists;    

END;
/
===============================================================

프로시저가 생성되었습니다.
 
SQL> SET SERVEROUTPUT ON:

-- emp 테이블명과 테이블의 데이터카운트를 INSERT합니다.
SQL> EXEC dynamic_sql_02('emp');
테이블 명 : emp  데이터 수 : 14

PL/SQL 처리가 정상적으로 완료되었습니다.


-- 정상적으로 처리되었는지 확인해 봅니다.
SQL> SELECT * FROM table_rows;
 
     TOTAL TABLE_NAME
---------- --------------
        14 emp
 

'DataBase > Oracle' 카테고리의 다른 글

[펌]IMPORT  (0) 2008.08.08
[펌]EXPORT  (0) 2008.08.08
[펌]DELETE, DROP, TRUNCATE의 비교  (0) 2008.08.08
[펌]DBMS_RLS: 행단위 보안 설정  (0) 2008.08.08
[펌]DB에 등록된 유저의 정보와, 유저별 Object 정보 조회  (0) 2008.08.08