创建Oracle表函数

时间:2018-03-26 14:24:53

标签: oracle function

我认为这是一个相当简单的问题,但我没有正确的语法。我想定义一个TABLE函数,以便我可以像:

一样使用它
SELECT * FROM TABLE(my_fct('20000101', '20991231'));

我目前的功能如下所示

CREATE OR REPLACE FUNCTION my_fct(p_FROM_DATE IN VARCHAR2, p_UNTIL_DATE IN VARCHAR2)
    RETURN IMP_EMPL_DATA%ROWTYPE PIPELINED
AS
    TYPE CurTyp IS REF CURSOR RETURN IMP_EMPL_DATA%ROWTYPE;
    rc CurTyp;

    CURSOR data IS SELECT *
        FROM IMP_EMPL_DATA IPED
        WHERE (IPED.STATUS = 'ACTIVE'
        AND IPED.CREATEDATE BETWEEN to_date(p_FROM_DATE, 'yyyymmdd') AND to_date(p_UNTIL_DATE, 'yyyymmdd');

BEGIN
    FOR rc IN data LOOP
        PIPE ROW (rc);
    END LOOP;
END;

我找到了几个定义新记录和表类型的示例。在我的例子中,我完全可以使用(现有的)表格行类型。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您无法使用TABLE函数返回记录。(RETURN IMP_EMPL_DATA%ROWTYPE)。

您应该在架构中创建OBJECT及其表TYPE,然后才能使用它。

CREATE
    OR replace type IMP_EMPL_DATA_OBJ AS OBJECT (
    col1 varchar2(10)
    ,col2 INT
    ,col3 DATE
    );  -- Include all columns of table IMP_EMPL_DATA

CREATE
    OR replace type 
IMP_EMPL_DATA_OBJ_TAB AS TABLE OF IMP_EMPL_DATA_OBJ;

现在,该函数应该返回集合类型

RETURN IMP_EMPL_DATA_OBJ_TAB PIPELINED AS ..

答案 1 :(得分:0)

语法应该是这样的:

CREATE OR REPLACE TYPE IMP_EMPL_DATA_REC AS OBJECT ( 
    STATUS VARCHAR2(15),
    CREATEDATE DATE,
    ...);

CREATE OR REPLACE TYPE IMP_EMPL_DATA_TABLE AS TABLE OF IMP_EMPL_DATA_REC;




CREATE OR REPLACE FUNCTION my_fct(p_FROM_DATE IN VARCHAR2, p_UNTIL_DATE IN VARCHAR2)
    RETURN IMP_EMPL_DATA_TABLE PIPELINED
AS
    rec IMP_EMPL_DATA_REC;

    CURSOR data IS 
    SELECT *
    FROM IMP_EMPL_DATA IPED
    WHERE (IPED.STATUS = 'ACTIVE'
       AND IPED.CREATEDATE BETWEEN to_date(p_FROM_DATE, 'yyyymmdd') AND to_date(p_UNTIL_DATE, 'yyyymmdd');

BEGIN
    FOR rc IN data LOOP
        rec := IMP_EMPL_DATA_REC(rc.STATUS, rc.CREATEDATE, ...);
        PIPE ROW(rec);
    END LOOP;
    RETURN;
END;