2012-02-28 9 views
5

wiem jak dostać jeden powrotny wartość z Oracle SP w Oracle jak postępowaćJak zdobyć dwie wartości zwracanej z procedury przechowywanej programu Oracle

MyReturn := MY_ORACLE_SP(); 

Jeśli wartość zwracana MY_ORACLE_SP2 jest więcej niż jednego. Jak mogę zrobić?

+1

"więcej niż jeden" _horizontally_ (to znaczy wiele pól) albo _vertically_ (kilka rzędów)? –

+0

funkcje mogą zwrócić tylko jeden obiekt. Ale może być złożonego typu ('TABELA jakiejś klasy'). Ale może chciałbyś skorzystać z procedur? – Benoit

+0

Mój SP zwróci dwie wartości. Dlatego nie wiem, jak uzyskać te dwie wartości zwrotu z mojego SP. – ppshein

Odpowiedz

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

wyjścia: 150 20

1

Użyj parametrów WYJŚCIA zamiast zwracanej wartości.

7

Co masz nie jest technicznie procedura, ale funkcja - z tą różnicą, że procedura nie posiada wartości zwracanej i nie może być użyty jako prawą stronę instrukcji przypisania.

Zasadniczo są dwie opcje:

(1) Wykorzystanie OUT parametrów. W tym przypadku utworzę procedurę z dwoma parametrami OUT. Ogólnie ludzie nie lubią funkcji, które mają również parametry OUT, ponieważ naruszają zwykłe oczekiwania. Odpowiedź @ Benoita pokazuje tę metodę.

(2) Zdefiniuj typ zawierający wiele wartości i użyj go jako typu zwrotu funkcji. Przykład:

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

Spróbuj poniżej kodu właśnie zmodyfikowany odpowiedź od użytkownika 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 
Powiązane problemy