我认为这是一个相当简单的问题,但我没有正确的语法。我想定义一个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;
我找到了几个定义新记录和表类型的示例。在我的例子中,我完全可以使用(现有的)表格行类型。
非常感谢任何帮助。
答案 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;