2016년 7월 28일 목요일

[IT실무고급교육★탑크리에듀]동적 SQL을 이용하여 DDL을 실행(ORACLE DYNAMIC SQL)


동적 SQL을 이용하여 DDL을 실행(ORACLE DYNAMIC SQL) 

 Dynamic SQL을 이용하면  CREATE, DROP, GRANT, REVOKE 등을 사용할 수 있다. 
 ALTER SESSION, SET 명령어등 SCL(Session Control Language)을 사용할 수 있다. 
 Dynamic SQL을 이용하면 SELECT절에 TABLE구를 사용할 수 있다. 

SQL> DROP TABLE x; 

SQL> DECLARE 
2  BEGIN 
3      EXECUTE IMMEDIATE 'create table x ( x varchar2(1))' ; 
  4 
  5      DBMS_OUTPUT.PUT_LINE('Table Created.'); 
  6  END; 
  7  / 
Table Created. 

SQL> select * from x; 
선택된 레코드가 없습니다. 

SQL> desc x; 
 이름                                      널?      유형 
 ----------------------------------------- -------- -------------------------- 
 X                                                  VARCHAR2(1) 

-- 아래는 동적SQL을 이용하여 SELECT절에 TABLE구를 사용하는 예제이다. 
SQL> SET SERVEROUTPUT ON 

-- type_emp라는 사번(empno)과 이름(ename)을 가지는 새로운 타입을 정의, 이타입이 아래 t_emplist라는 테이블 타입의 값으로 들어가는 TYPE이다. 
SQL> CREATE TYPE type_emp AS OBJECT (empno NUMBER, ename VARCHAR2(20)) 
  2  / 
유형이 생성되었습니다. 

-- t_emplist라는 테이블 타입을 선언, 이 타입이 아래 dept_temp 테이블 emps 칼럼의 타입이 된다. 결국 emps 칼럼은 여러 사원들을 담을 수 있는 구조가 된 것이다. 
SQL> CREATE TYPE t_emplist AS TABLE OF type_emp 
  2  / 
유형이 생성되었습니다. 

SQL> CREATE TABLE dept_temp (deptno NUMBER, emps t_emplist) 
  2      NESTED TABLE emps STORE AS emp_table; 
테이블이 생성되었습니다. 

SQL> INSERT INTO dept_temp VALUES ( 
  2      10, 
  3      t_emplist( 
  4          type_emp(1, 'SCOTT'), 
  5          type_emp(2, 'TIGER'))); 
1 개의 행이 만들어졌습니다. 

SQL> INSERT INTO dept_temp VALUES ( 
  2      20, 
  3      t_emplist( 
  4          type_emp(1, 'JCLEE'), 
  5          type_emp(2, 'ORACLEJAVACOMMUNITY'))); 
1 개의 행이 만들어졌습니다. 

SQL> DECLARE 
  2      v_deptno dept.deptno%TYPE; 
  3      v_empno emp.empno%TYPE; 
  4      v_ename  emp.ename%TYPE; 
  5  BEGIN 
  6      -- 아래 TABLE구는 동적SQL로만 실행 가능하다. 
  7      EXECUTE IMMEDIATE 'SELECT d.deptno, e.empno, e.ename 
  8                        FROM dept_temp d, TABLE(d.emps) e 
  9                        WHERE d.deptno = 10 AND e.empno = 1' 
 10              INTO v_deptno, v_empno, v_ename; 
 11      DBMS_OUTPUT.PUT_LINE(v_deptno || ':' || v_empno || ':' || v_ename); 
 12  END; 
 13  / 

10:1:SCOTT

댓글 없음:

댓글 쓰기