日期:2014-05-17  浏览次数:20810 次

pl/sql 存储过程中 返回一个记录集,怎么返回,接受的时候怎么接受
现在在函数A中创建了一个索引表,然后有个函数B需要传入这个索引表,在函数B接收的地方怎么命名类型,一般不都是什么什么%TYPE吗,这个接收的时候怎么写,在这个函数B里面我对这个索引表的纪录集进行了编辑,怎么返回函数A?谢谢,在线等,着急

------解决方案--------------------
/* Formatted on 2007/08/22 11:00 (Formatter Plus v4.8.6) */
CREATE OR REPLACE PACKAGE test01
AS
/******************************************************************************
NAME: test01
PURPOSE:

REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2007-8-17 1. Created this package.
******************************************************************************/


TYPE account_record_type IS RECORD (
ID VARCHAR2 (20),
NAME VARCHAR2 (20)
);

TYPE account_table_type IS TABLE OF account_record_type
INDEX BY BINARY_INTEGER;

FUNCTION a
RETURN INTEGER;

FUNCTION b (p_t IN account_table_type)
RETURN account_table_type;

END test01;
/

/* Formatted on 2007/08/22 11:44 (Formatter Plus v4.8.6) */
CREATE OR REPLACE PACKAGE BODY test01
AS
/******************************************************************************
NAME: test01
PURPOSE:

REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2007-8-17 1. Created this package.
******************************************************************************/
FUNCTION a
RETURN INTEGER
IS
v_i INTEGER;
v_t account_table_type;
v_r account_record_type;
v_p account_table_type;
BEGIN
v_r.ID := '1 ';
v_r.NAME := 'aa ';
v_t (1) := v_r;
v_r.ID := '2 ';
v_r.NAME := 'bb ';
v_t (2) := v_r;
v_p := b (v_t);
--用于查看funb的返回结果
FOR i IN 1 .. v_p.COUNT
LOOP
v_r := v_p (i);
DBMS_OUTPUT.put_line (v_r.ID || v_r.NAME);
END LOOP;

v_i := v_p.COUNT;
RETURN v_i;
END a;

FUNCTION b (p_t IN account_table_type)
RETURN account_table_type
IS
v_t account_table_type;
v_r account_record_type;
BEGIN

FOR i IN 1 .. p_t.COUNT
LOOP
v_r := p_t (i);
v_r.NAME := v_r.NAME || 'funb ';
v_t(i):=v_r;
END LOOP;

RETURN v_t;
END b;
END test01;
/


--toad test
declare
i integer;
begin
i:=test01.a;
dbms_output.put_line(to_char(i));
end;

--测试结果
1aafunb
2bbfunb
2


--lz如果想用两个包也是可以的,只是调用的地方,还有类型的地方要加上包名
------解决方案--------------------
如果输入输出参数类型一样
也可以这样
FUNCTION b1 (p_t IN OUT account_table_type)
RETURN integer;

FUNCTION b1 (p_t IN OUT account_table_type)
RETURN integer
is
v_r account_record_type;
v_i integer;
BEGIN

FOR i IN 1 .. p_t.COUNT
LOOP
v_r := p_t (i);
v_r.NAME := v_r.NAME || 'funb1 ';
p_t(i):=v_r;
END LOOP;

RETURN v_i;
END b1;