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
런타임중에 쿼리의 검색조건이나 정렬순서, 힌트 등을 지정할 수 있다.
-- 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
댓글 없음:
댓글 쓰기