首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >创建返回表的Oracle函数

创建返回表的Oracle函数
EN

Stack Overflow用户
提问于 2010-05-14 03:58:20
回答 3查看 140.3K关注 0票数 25

我正在尝试在包中创建一个返回表的函数。我希望在包中调用该函数一次,但能够多次重用它的数据。虽然我知道我在Oracle中创建临时表,但我希望让它保持干爽。

到目前为止,我得到的是:

标题:

代码语言:javascript
复制
CREATE OR REPLACE PACKAGE TEST AS 

    TYPE MEASURE_RECORD IS RECORD (
      L4_ID VARCHAR2(50),
      L6_ID VARCHAR2(50),
      L8_ID VARCHAR2(50),
      YEAR NUMBER,
      PERIOD NUMBER,
      VALUE NUMBER
    );

    TYPE MEASURE_TABLE IS TABLE OF MEASURE_RECORD;

    FUNCTION GET_UPS(
      TIMESPAN_IN IN VARCHAR2 DEFAULT 'MONTLHY',
      STARTING_DATE_IN DATE,
      ENDING_DATE_IN DATE  
    ) RETURN MEASURE_TABLE;

END TEST;

正文:

代码语言:javascript
复制
CREATE OR REPLACE PACKAGE BODY TEST AS 

  FUNCTION GET_UPS (
    TIMESPAN_IN IN VARCHAR2 DEFAULT 'MONTLHY',
    STARTING_DATE_IN DATE,
    ENDING_DATE_IN DATE
  ) RETURN MEASURE_TABLE IS

    T MEASURE_TABLE;

  BEGIN

        SELECT  ...
        INTO    T
        FROM    ...

      ;

  RETURN T;

  END GET_UPS;

END TEST;

头文件编译,主体文件不编译。一条错误消息是“值不足”,这可能意味着我应该选择MEASURE_RECORD,而不是MEASURE_TABLE。

我遗漏了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-14 06:22:35

我想你想要一台pipelined table function

如下所示:

代码语言:javascript
复制
CREATE OR REPLACE PACKAGE test AS

    TYPE measure_record IS RECORD(
       l4_id VARCHAR2(50), 
       l6_id VARCHAR2(50), 
       l8_id VARCHAR2(50), 
       year NUMBER, 
       period NUMBER,
       VALUE NUMBER);

    TYPE measure_table IS TABLE OF measure_record;

    FUNCTION get_ups(foo NUMBER)
        RETURN measure_table
        PIPELINED;
END;

CREATE OR REPLACE PACKAGE BODY test AS

    FUNCTION get_ups(foo number)
        RETURN measure_table
        PIPELINED IS

        rec            measure_record;

    BEGIN
        SELECT 'foo', 'bar', 'baz', 2010, 5, 13
          INTO rec
          FROM DUAL;

        -- you would usually have a cursor and a loop here   
        PIPE ROW (rec);

        RETURN;
    END get_ups;
END;

为简单起见,我删除了您的参数,并且没有在函数中实现循环,但您可以看到原理。

用法:

代码语言:javascript
复制
SELECT *
  FROM table(test.get_ups(0));



L4_ID L6_ID L8_ID       YEAR     PERIOD      VALUE
----- ----- ----- ---------- ---------- ----------
foo   bar   baz         2010          5         13
1 row selected.
票数 40
EN

Stack Overflow用户

发布于 2010-05-14 16:20:47

要一次返回整个表,您可以将SELECT更改为:

代码语言:javascript
复制
SELECT  ...
BULK COLLECT INTO T
FROM    ...

这只适用于不太大的结果,因为它们都必须在返回之前在内存中累积;否则,请考虑Charles建议的流水线函数,或者返回引用游标。

票数 6
EN

Stack Overflow用户

发布于 2015-07-03 14:30:55

代码语言:javascript
复制
  CREATE OR REPLACE PACKAGE BODY TEST AS 

   FUNCTION GET_UPS(
   TIMESPAN_IN IN VARCHAR2 DEFAULT 'MONTLHY',
   STARTING_DATE_IN DATE,
   ENDING_DATE_IN DATE
   )RETURN MEASURE_TABLE IS

    T MEASURE_TABLE;

 BEGIN

    **SELECT   MEASURE_RECORD(L4_ID , L6_ID ,L8_ID ,YEAR ,
             PERIOD,VALUE )  BULK COLLECT  INTO    T
    FROM    ...**

  ;

   RETURN T;

   END GET_UPS;

END TEST;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2829880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档