我试图在包中创建一个返回一个表的函数.我希望在包中调用该函数一次,但是可以多次重用数据.虽然我知道我在Oracle中创建了临时表,但我希望能够将事情保持在干燥状态.
到目前为止,这是我所拥有的:
标题:
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;
身体:
CREATE OR REPLACE PACKAGE BODY TEST AS FUNCTION GET_UPS ( TIMESPAN_IN IN VARCHAR2 DEFAULT 'MONTLHY',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.
我失踪了什么
我想你想要一个
pipelined table function.
这样的事情
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;
为了简单起见,我删除了你的参数,并没有在函数中实现循环,但是你可以看到原理.
用法:
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.