2012-02-28 52 views
5

tôi biết làm thế nào để có được một trở lại giá trị từ Oracle SP trong Oracle như sauLàm thế nào để có được hai giá trị trả về từ Oracle Stored Procedure

MyReturn := MY_ORACLE_SP(); 

Nếu giá trị trả về MY_ORACLE_SP2 là nhiều hơn một. Làm thế nào tôi có thể làm được?

+1

"Hơn một" _horizontally_ (ví dụ: nhiều lĩnh vực) hoặc _vertically_ (nhiều hàng)? Các hàm –

+0

chỉ có thể trả về một đối tượng. Nhưng nó có thể là kiểu phức tạp ('TABLE OF some_type'). Nhưng có lẽ bạn muốn sử dụng các thủ tục? – Benoit

+0

SP của tôi sẽ trả về hai giá trị. Đó là lý do tại sao tôi không biết làm thế nào để có được hai giá trị trả về từ SP của tôi. – ppshein

Trả lời

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ết quả đầu ra: 150 20

1

Sử dụng tham số OUTPUT thay vì giá trị trả lại.

7

gì bạn đã có kỹ thuật không phải là một thủ tục , nhưng một chức năng - sự khác biệt là một thủ tục không có giá trị trả về và không thể được sử dụng như bên phải của một câu lệnh gán.

Về cơ bản, bạn có hai tùy chọn:

(1) Sử dụng thông số OUT. Trong trường hợp này, tôi sẽ làm cho nó một thủ tục với hai tham số OUT. Nói chung mọi người không thích các hàm cũng có các tham số OUT, vì nó vi phạm các kỳ vọng thông thường. @ Benoit của câu trả lời cho thấy phương pháp này.

(2) Xác định loại có chứa nhiều giá trị và sử dụng loại này làm kiểu trả về của hàm. Ví dụ:

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

Hãy thử đoạn code dưới đây tôi chỉ sửa đổi những phản hồi từ người dùng 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 
Các vấn đề liên quan