gpt4 book ai didi

plsql - 创建一个返回表的 Oracle 函数

转载 作者:行者123 更新时间:2023-12-03 12:06:46 25 4
gpt4 key购买 nike

我正在尝试在包中创建一个返回表的函数。我希望在包中调用一次该函数,但能够多次重用其数据。虽然我知道我在 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;

body :
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。

我错过了什么?

最佳答案

我想你想要一个 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.

关于plsql - 创建一个返回表的 Oracle 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2829880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com