Oracle/PL/SQL2013. 9. 1. 11:00

REFERENCE CURSOR의 예제를 살펴보자.

 

아래 프로시저와 함수는 테이블 명을 입력받아 결과를 REFERENCE CURSOR로 반환한다.

-- p1
CREATE OR REPLACE PROCEDURE p1 (
    i_owner         IN        VARCHAR2
  , i_table_name    IN        VARCHAR2
  , o_result        OUT       SYS_REFCURSOR
)
IS
    l_sql_text    VARCHAR2 (32767);
BEGIN
    l_sql_text := 'SELECT * FROM ' || i_owner || '.' || i_table_name;
    OPEN o_result FOR l_sql_text;
END p1;
/

-- f1
CREATE OR REPLACE FUNCTION f1 (
    i_owner         IN    VARCHAR2
  , i_table_name    IN    VARCHAR2
)
    RETURN SYS_REFCURSOR
IS
    o_result      SYS_REFCURSOR;
    l_sql_text    VARCHAR2 (32767);
BEGIN
    l_sql_text := 'SELECT * FROM ' || i_owner || '.' || i_table_name;
    OPEN o_result FOR l_sql_text;
    RETURN o_result;
END f1;
/

 

아래는 SQL*Plus에서 프로시저와 함수를 수행한 결과다.

VAR v_result REFCURSOR;

-- p1
EXEC p1 ('SCOTT', 'DEPT', :v_result);

PRINT :v_result;

DEPTNO DNAME      LOC
------ ---------- --------
    10 ACCOUNTING NEW YORK
    20 RESEARCH   DALLAS
    30 SALES      CHICAGO
    40 OPERATIONS BOSTON

4 행이 선택되었습니다.

-- f1
EXEC :v_result := f1 ('SCOTT', 'DEPT');

PRINT :v_result;

DEPTNO DNAME      LOC
------ ---------- --------
    10 ACCOUNTING NEW YORK
    20 RESEARCH   DALLAS
    30 SALES      CHICAGO
    40 OPERATIONS BOSTON

4 행이 선택되었습니다.


'Oracle > PL/SQL' 카테고리의 다른 글

동적 순위 부여  (0) 2014.04.23
DBMS_UTILITY.EXPAND_SQL_TEXT 프로시저  (0) 2014.04.19
한글 자소 분리  (0) 2012.06.22
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 예제  (0) 2012.05.11
LONG 타입을 VARCHAR2 타입으로 변환  (0) 2012.05.10
Posted by 정희락_