2010-08-17 105 views
4

如何從PL-SQL函數中返回2個值?從PL-SQL函數中返回2個值

+0

你不能返回兩個值......有一兩件事你可以做的是..讓一個數組n合併兩個values.and返回它 – PHP 2010-08-17 07:10:55

回答

4

您可以直接返回一個值,另一個爲OUT參數。或者您返回包含這兩個值的記錄。在大多數情況下,第一種選擇更簡單。

+7

它被普遍認爲是不好的做法,有一個OUT參數在函數的簽名中。 – APC 2010-08-17 13:05:25

+1

函數應該返回1個值,存儲過程可以並應該用於返回多個值。 – Kuberchaun 2010-08-18 17:01:02

0

嘗試使用OUT參數:

create or replace function f(a IN NUMBER, b OUT NUMBER) RETURN NUMBER IS 
BEGIN 
    b := a; 
    RETURN a; 
END f; 
13

我不會主張與用於第二值OUT參數創建一個功能,因爲我喜歡把用作純概念:一個函數對一個或多個輸入的操作,以產生一個輸出。它不應該改變任何論點或有任何其他「副作用」。

所以如果你需要兩個輸出,寫一個程序代替

procedure get_sqrt_and_half 
    (p_input number 
    , p_sqrt OUT number 
    , p_half OUT number 
    ) 
is 
begin 
    p_sqrt := sqrt(p_input); 
    p_half := p_input/2; 
end; 
+2

我同意託尼。任何具有多個輸出或使用IN OUT參數的應該是一個過程。通過保持函數清潔(沒有外部副作用),將函數調用鏈接在一起變得更容易,當有參數輸入/輸出時,您無法輕鬆執行這些調用。 請記住,函數的輸出可能是複雜類型 - %ROWTYPE,用戶定義的記錄,對象類型,集合或引用遊標 - 有很多方法可以返回複雜的數據。 – JulesLt 2010-08-17 09:20:22

6

函數只能返回一個SQL類型,但可以是用戶定義的類型有多個值。在推薦此解決方案之前,我需要更多地瞭解實際的最終需求,但這是一種可能性。

create or replace type a_b is object (a number, b number); 
/

create or replace function ret_a_b return a_b is 
begin 
    return a_b(1,2); 
end; 
/

select ret_a_b from dual; 

select d.rab.a, d.rab.b from (select ret_a_b rab from dual) d; 
1
**If you are wanting to use it in SQL, then you would need a pipelined function e.g.** 

CREATE OR REPLACE TYPE myemp AS OBJECT 
(empno number, 
    ename varchar2(10), 
    job  varchar2(10), 
    mgr  number, 
    hiredate date, 
    sal  number, 
    comm  number, 
    deptno number 
); 

CREATE OR REPLACE TYPE myrectable AS TABLE OF myemp ; 


    enter code here 

CREATE OR REPLACE FUNCTION pipedata(p_min_row number, p_max_row number) RETURN myrectable PIPELINED IS 
    v_obj myemp := myemp(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 
BEGIN 
    FOR e IN (select * 
      from (
        select e.* 
         ,rownum rn 
        from (select * from emp order by empno) e 
       ) 
      where rn between p_min_row and p_max_row) 
    LOOP 
    v_obj.empno := e.empno; 
    v_obj.ename := e.ename; 
    v_obj.job  := e.job; 
    v_obj.mgr  := e.mgr; 
    v_obj.hiredate := e.hiredate; 
    v_obj.sal  := e.sal; 
    v_obj.comm  := e.comm; 
    v_obj.deptno := e.deptno; 
    PIPE ROW (v_obj); 
    END LOOP; 
    RETURN; 
END; 

SQL> select * from table(pipedata(1,5));