2012-12-02 10 views
6

Oracle SQLプロシージャが表を戻すことはできますか?私は現在dbms_outputを使って2つのカーソルの出力をループしていますが、2つの列が返されていればそれはより美しく見えます。プロシージャ内で可能なのでしょうか?SQLプロシージャーが表を戻すことはできますか?

+0

あなたはどのようなデータベースを使用していますか? – Lee

+0

私はOracleを使用しています – Jaqualembo

+0

どのように手続きを消費していますか?結果セットをCursorからSYS_REFCURSORデータ型のOUTパラメータに戻すことはできますが、クライアントは結果セットの読込みをサポートする必要があります。 –

答えて

8

PL/SQL関数はネストした表を戻すことができます。ネストされたテーブルをSQL型として宣言すると、the TABLE() functionを使用してクエリのソースとして使用できます。ここで

はタイプであり、それから構築された、ネストされたテーブル:ここ

SQL> create or replace type emp_dets as object (
    2 empno number, 
    3 ename varchar2(30), 
    4 job varchar2(20)); 
    5/

Type created. 

SQL> create or replace type emp_dets_nt as table of emp_dets; 
    2/

Type created. 

SQL> 

は、ネストされたテーブルを返す関数...

create or replace function get_emp_dets (p_dno in emp.deptno%type) 
    return emp_dets_nt 
is 
    return_value emp_dets_nt; 
begin 
    select emp_dets(empno, ename, job) 
    bulk collect into return_value 
    from emp 
    where deptno = p_dno; 
    return return_value; 
end; 
/

です...これはどのようにありますそれは動作します:

SQL> select * 
    2 from table(get_emp_dets(10)) 
    3/

    EMPNO ENAME       JOB 
---------- ------------------------------ -------------------- 
     7782 CLARK       MANAGER 
     7839 KING       PRESIDENT 
     7934 MILLER       CLERK 

SQL> 

SQL型は、私たちに多大な機能を提供し、PL/SQLで非常に洗練されたAPIを構築することを可能にします。 Find out more

0

これも役立つことがあります。

DECLARE 
    TYPE t_emptbl IS TABLE OF scott.emp%rowtype; 
    v_emptbl t_emptbl; 
    ret_val t_emptbl; 
    -- 
    Function getEmployeeList Return t_emptbl 
    IS 
    BEGIN 
    SELECT * bulk collect INTO v_emptbl FROM scott.emp; 
    -- Print nested table of records: 
    FOR i IN 1 .. v_emptbl.COUNT LOOP 
     DBMS_OUTPUT.PUT_LINE (v_emptbl(i).empno); 
    END LOOP; 
    RETURN v_emptbl; 
    END; 
    -- 
    BEGIN 
    ret_val:= getEmployeeList; 
    END; 
/
1

を私は(Oracleのバージョンがサポートしている場合)あなたはこのためにOracleのカーソルを使用することができると思います。

PROCEDURE myprocedure(
    mycursor OUT SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN mycursor FOR SELECT * FROM mytable; 
END; 
END; 
関連する問題