2015년 8월 13일 목요일

Dynamic SQL 사용하기(SQL문을 동적으로 생성)

Dynamic SQL 사용하기(SQL문을 동적으로 생성)

 런타임중에 쿼리의 검색조건이나 정렬순서, 힌트 등을 지정할 수 있다.

-- EMP 테이블에서 10번 부서원들의 이름, 급여 출력
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    TYPE EmpCurTyp IS REF CURSOR;
  3    myCur EmpCurTyp;
  4    stmt_str VARCHAR2(2000);
  5    v_ename emp.ename%TYPE;
  6    v_sal emp.sal%TYPE;
  7  BEGIN
  8    stmt_str := 'SELECT ename, sal FROM emp WHERE deptno = :1';
  9    OPEN myCur FOR stmt_str USING 10;
 10
 11  LOOP
 12    FETCH myCur INTO v_ename, v_sal;
 13    EXIT WHEN myCur%NOTFOUND;
 14    DBMS_OUTPUT.PUT_LINE(v_ename || ',' || v_sal);
 15  END LOOP;
 16  CLOSE myCur;
 17  END;
 18  /
CLARK,3404.4
KING,6946.8
MILLER,2257.5

-- 아래는 INSERT 예제이다.
SQL> DECLARE
      stmt_str VARCHAR2(200);
      v_empno NUMBER := 4790;
      v_deptno NUMBER := 30;
      v_ename VARCHAR2(20) := 'OJC';
      v_sal NUMBER(4) := 3500;
  BEGIN
      stmt_str := 'INSERT INTO emp(empno, ename, sal, deptno) VALUES
                (:empno, :ename, :sal, :deptno)';
    EXECUTE IMMEDIATE stmt_str
      USING v_empno, v_ename, v_sal, v_deptno;
  END;
  /

SQL> select empno, ename ,sal, deptno from emp where empno = 4790;

    EMPNO ENAME            SAL    DEPTNO
---------- ---------- ---------- ----------
      4790 OJC              3500        30

-- RETURNING구 사용예제이다.
SQL> DECLARE
  2    stmt_str  VARCHAR2(200);
  3    v_loc    dept.loc%TYPE := 'GURODIGITAL';
  4    v_deptno  NUMBER := 10;
  5    deptname  VARCHAR2(20);
  6  BEGIN
  7    stmt_str := 'UPDATE dept2
  8                SET loc = :newloc
  9                WHERE deptno = :deptno
 10                RETURNING dname INTO :dname';
 11    EXECUTE IMMEDIATE stmt_str
 12      USING v_loc, v_deptno,OUT deptname;
 13
 14    DBMS_OUTPUT.PUT_LINE(deptname);
 15  END;
 16  /

ACCOUNTING 

댓글 없음:

댓글 쓰기