[英]Retrieve rows from table via function
我想做什么:使用自定义函数和自定义类型从表中检索数据。
我的桌子的结构如下:
create table ACCOUNTCONTRACT
(
accountcode_ VARCHAR2(255 CHAR),
accountmig_ NUMBER(1),
accountnumber_ VARCHAR2(25 CHAR) not null,
accountpk_ NUMBER(19),
addinfo1_ VARCHAR2(255 CHAR),
addinfo2_ VARCHAR2(255 CHAR),
...
我所做的:创建我的自定义类型
CREATE OR REPLACE TYPE "FO_OUTPUT" AS OBJECT
(
NUMCPT VARCHAR2(10),
ACTIONACCOUNT VARCHAR2(50)
)
和
CREATE OR REPLACE TYPE "FO_OUTPUT_TABLE" AS TABLE OF FO_OUTPUT
我的职能是:
CREATE OR REPLACE FUNCTION OUTPUT_FO RETURN FO_OUTPUT_TABLE AS
RETVAL FO_OUTPUT_TABLE := FO_OUTPUT_TABLE();
TMPLINE FO_OUTPUT;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
FOR I IN (SELECT SUBSTR(ACC.ACCOUNTNUMBER_, 1, 10) AS NUMCPT,
ACC.ACCOUNTNUMBER_ AS ACTIONACCOUNT
INTO TMPLINE.NUMCPT, TMPLINE.ACTIONACCOUNT
FROM ACCOUNTCONTRACT ACC
WHERE ROWNUM < 10) LOOP
RETVAL.EXTEND;
RETVAL(RETVAL.COUNT) := TMPLINE;
END LOOP;
RETURN(RETVAL);
END OUTPUT_FO;
现在,当我执行:`SELECT * FROM TABLE(OUTPUT_FO)我只得到10个空行。
我的代码有什么问题。 日Thnx
CREATE OR REPLACE FUNCTION OUTPUT_FO RETURN FO_OUTPUT_TABLE AS RETVAL FO_OUTPUT_TABLE := FO_OUTPUT_TABLE();
TMPLINE FO_OUTPUT;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
TMPLINE := FO_OUTPUT('', '');
FOR I IN (SELECT SUBSTR(ACC.ACCOUNTNUMBER_, 1, 10) AS NUMCPT,
ACC.ACCOUNTNUMBER_ AS ACTIONACCOUNT
--INTO TMPLINE.NUMCPT, TMPLINE.ACTIONACCOUNT << this does not work
FROM ACCOUNTCONTRACT ACC
WHERE ROWNUM < 10) LOOP
-- But this:
TMPLINE.numcpt:= i.numcpt;
TMPLINE.ACTIONACCOUNT:= i.ACTIONACCOUNT;
RETVAL.EXTEND;
RETVAL(RETVAL.COUNT) := TMPLINE;
END LOOP;
RETURN(RETVAL);
END OUTPUT_FO;
使用BULK COLLECT INTO
:
CREATE OR REPLACE FUNCTION OUTPUT_FO
RETURN FO_OUTPUT_TABLE
AS
RETVAL FO_OUTPUT_TABLE;
BEGIN
SELECT FO_OUTPUT(
SUBSTR(ACC.ACCOUNTNUMBER_, 1, 10),
ACC.ACCOUNTNUMBER_
)
BULK COLLECT INTO RETVAL
FROM ACCOUNTCONTRACT ACC
WHERE ROWNUM < 10;
RETURN RETVAL;
END OUTPUT_FO;
/
这是我如何使它工作的:
CREATE OR REPLACE FUNCTION OUTPUT_FO RETURN FO_OUTPUT_TABLE AS
RETVAL FO_OUTPUT_TABLE := FO_OUTPUT_TABLE();
BEGIN
FOR I IN (SELECT SUBSTR(ACC.ACCOUNTNUMBER_, 1, 10) AS NUMCPT,
ACC.ACCOUNTNUMBER_ AS ACTIONACCOUNT
FROM ACCOUNTCONTRACT ACC
WHERE ROWNUM < 10) LOOP
RETVAL.EXTEND;
RETVAL(RETVAL.COUNT) := FO_OUTPUT(I.NUMCPT, I.ACTIONACCOUNT);
END LOOP;
RETURN(RETVAL);
END OUTPUT_FO;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.