본문 바로가기

Database/PLSQL

060 - [Oracle PL/SQL] Dynamic SQL - USING Clause

<샘플코드에서 사용한 데이터는 HR 스키마이고, 오라클 설치시 생성할 수 있는 기본 스키마 입니다>

 

 

 

# EXECUTE IMMEDIATE with USING

# 우선 테이블 데이터를 모두 삭제한다
delete from emp1;
select * from emp1;

-- this procedure can work with any table contain 1 coulmn and 
-- this column should be number

create or replace procedure add_rows 
    ( p_table_name varchar2, p_value number )
is
begin
    --EXECUTE IMMEDIATE 'insert into '||p_table_name ||' values('||p_value||') ';
    EXECUTE IMMEDIATE 'insert into '||p_table_name ||' values(:1) ' using p_value;
end;
------------------------------------------------------------
Procedure ADD_ROWS compiled


# emp1 테이블은 데이터 타입이 숫자인 필드를 1개만 가지고 있다
desc emp1;
----------------------
Name   Null? Type   
------ ----- ------ 
EMP_ID       NUMBER


# 테이블 이름과 데이터를 입력한다
execute add_rows ('emp1',10);


# 테이블에 데이터가 1개인 것을 확인
select * from emp1;
------------------------------
    EMP_ID
----------
        10


# 전체 데이터 삭제
delete emp1;


# 내부변수를 이용하여 같은 테이블에 추가로 삽입
create or replace procedure add_rows 
    ( p_table_name varchar2,p_value number )
is
    val1 number:=20;
    val2 number:=30;
begin
    EXECUTE IMMEDIATE 'insert into '||p_table_name ||' values(:1)  ' using p_value;
    EXECUTE IMMEDIATE 'insert into '||p_table_name ||' values(:yy) ' using val1;
    EXECUTE IMMEDIATE 'insert into '||p_table_name ||' values(:uuu)' using val2;
end;


# 패키지 실행
execute add_rows ('emp1',10);


# 실제 입력된 순서대로 입력된다.
select rowid, emp_id from emp1;
-----------------------------------------------
ROWID                  EMP_ID
------------------ ----------
AAAR3cAAEAAAKAMAAA         20
AAAR3cAAEAAAKAMAAB         30
AAAR3cAAEAAAKAMAAE         10