2012-12-02 73 views
6

Oracle SQL過程可以返回表嗎?我目前使用dbms_output來打印循環中的兩個遊標的輸出,但如果它返回兩列,這看起來會更好。這是可能的程序內嗎?一個SQL過程可以返回一個表嗎?

+0

什麼數據庫您使用的? – Lee

+0

我正在使用Oracle – Jaqualembo

+0

您如何使用該過程?您可以通過SYS_REFCURSOR數據類型的OUT參數從Cursor返回結果集,但您的客戶端需要支持讀取結果集。 –

回答

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; 
相關問題