2012-02-28 217 views
5

我知道如何從Oracle SP在Oracle中得到一個返回值如下如何從Oracle獲得兩個返回值存儲過程

MyReturn := MY_ORACLE_SP(); 

如果MY_ORACLE_SP2的返回值是多個。我能怎麼做?

+1

「多個」 _horizo​​ntally_(即多個字段)或_vertically_(多行)的反應? – 2012-02-28 14:58:13

+0

函數只能返回一個對象。但它可以是複雜類型('TABLE of some_type')。但也許你想使用程序? – Benoit 2012-02-28 15:00:13

+0

我的SP會返回兩個值。這就是爲什麼我不知道如何從SP獲得這兩個回報價值。 – ppshein 2012-02-28 15:40:03

回答

16
-- IN arguments : you get them. You can modify them locally but caller won't see it 
-- IN OUT arguments: initialized by caller, already have a value, you can modify them and the caller will see it 
-- OUT arguments: they're reinitialized by the procedure, the caller will see the final value. 
CREATE PROCEDURE f (p IN NUMBER, x IN OUT NUMBER, y OUT NUMBER) 
IS 
BEGIN 
    x:=x * p; 
    y:=4 * p; 
END; 
/

SET SERVEROUTPUT ON 

declare 
    foo number := 30; 
    bar number := 0; 
begin 
    f(5,foo,bar); 
    dbms_output.put_line(foo || ' ' || bar); 
end; 
/

輸出:150 20

1

使用OUTPUT參數而不是返回值。

7

你有什麼存在技術上不是程序,但功能 - 不同的是一個過程沒有返回值,不能使用作爲賦值語句的右邊。

基本上有兩種選擇:

(1)使用OUT參數。在這種情況下,我將使它具有兩個OUT參數的過程。通常人們不喜歡也具有OUT參數的函數,因爲它違反了通常的期望。 @ Benoit的答案顯示了這種方法。

(2)定義一個包含多個值的類型,並將其用作函數的返回類型。例如:

CREATE TYPE two_values AS object (
    A NUMBER, 
    b number 
); 
/

CREATE FUNCTION get_two_values RETURN two_values AS 
BEGIN 
    RETURN two_values(2,4); 
END; 
/
-2

嘗試下面的代碼我只是修改從用戶貝努瓦

ab=`sqlplus -s system/password << eof 

SET SERVEROUTPUT ON 
set pagesize 0; 
set heading off; 
set feedback off; 
set linesize 5000; 
set trimspool on; 
declare 
    foo number := 30; 
    bar number := 0; 
begin 
    f(5,foo,bar); 
    dbms_output.put_line(foo || ' ' || bar); 
end; 
/

eof` 

echo $ab