繁体   English   中英

通过函数从表中检索行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM