2012-02-28 6 views
5

Saklanan Oracle iki dönüş değeri elde etmek. Nasıl yapabilirim?nasıl Oracle Oracle SP den <strong>bir dönüş</strong> değer elde bilen Yordam

+1

"birden fazla" _horizontally_ (yani birden fazla alanın) ya da _vertically_ (çoklu satır) gelen yanıt modifiye aşağıdaki kodu deneyin? –

+0

işlevleri yalnızca bir nesneyi döndürebilir. Ancak karmaşık bir türden olabilir ('' some_type '' TABLOSU). Ama belki prosedürleri kullanmak ister misiniz? – Benoit

+0

SP'm iki değer döndürecek. Bu yüzden bu iki dönüş değerini SP'mden nasıl alacağımı bilmiyorum. – ppshein

cevap

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; 
/

çıkışlar: 150 20

1

Dönüş değeri yerine OUTPUT parametrelerini kullanın.

7

orada bir prosedür teknik değil, ama ne iyi fonksiyonu - bir prosedür dönüş değeri yoktur ve kullanılamaz aradaki fark atama bildiriminin sağ tarafı olarak.

(1) parametreleri OUT kullanın:

Temelde iki seçenek vardır. Bu durumda iki OUT parametresiyle bir prosedür yapardım. Genelde insanlar, olağan beklentileri ihlal ettiği için OUT parametrelerine sahip olan işlevleri sevmezler. @ Benoit'in cevabı bu yöntemi göstermektedir.

(2) Birden çok değer içeren bir tür tanımlayın ve bunu işlevin dönüş türü olarak kullanın. Örnek:

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

Sadece kullanıcı Benoit

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