2013-10-29 35 views
0

我有一個過程,給一個值作爲輸入,做了一些過程之後,使用該過程中的遊標,我希望該過程返回一個表。如何使用其中有光標的過程返回表? PL/SQL

這個作爲input_param給出的值是用於標識多行的非唯一ID。

所以這樣我可以像運行一個命令:

select * from {call(procedure_name(input_Param)}

我PLSQL的知識是有限的。

我不確定一個過程是否可以在其中有一個遊標定義,如果可能的話,我該如何從過程返回一個完整的表。

順便說一句:這個過程必須使用select語句來調用,如果不是select語句,那麼它應該返回一個表,最後是select *。 如果我必須指定要輸出的列而不是select *,是否需要將所有這些列名稱提供爲input_Params?即。如果我希望程序只返回少量列,我該怎麼辦?

感謝

回答

2

您需要使用PIPELINED功能。下面的例子,鏈接到最後的更多信息。

CREATE TABLE test_pipe (
    id NUMBER, 
    name VARCHAR2(20), 
    salary NUMBER 
); 

INSERT INTO test_pipe VALUES (1, 'Smith', 5000); 
INSERT INTO test_pipe VALUES (2, 'Brown', 8000); 
INSERT INTO test_pipe VALUES (3, 'Bay', 10000); 

COMMIT; 


CREATE TYPE t_pipe_row_test AS OBJECT (
    name VARCHAR2(20), 
    salary NUMBER 
); 
/

CREATE TYPE t_pipe_test_tab IS TABLE OF t_pipe_row_test; 
/

CREATE OR REPLACE FUNCTION test_func_pipe(p_min_salary IN NUMBER) 
    RETURN t_pipe_test_tab 
    PIPELINED 
AS 
BEGIN 
    FOR v_rec IN (SELECT name, salary 
        FROM test_pipe 
       WHERE salary >= p_min_salary) 
    LOOP 
    PIPE ROW (t_pipe_row_test(v_rec.name, v_rec.salary)); 
    END LOOP; 
END; 
/

SELECT * FROM TABLE(test_func_pipe(6000)); 

輸出:

NAME      SALARY 
-------------------- ---------- 
Brown      8000 
Bay      10000

More about pipelined functions by Tim Hall