我目前有一个表函数可以返回数据表。该数据由内部的7个函数检索,并全部称为一行中的值,然后重复执行I次以创建数据行表。当我需要检索12个项目时,一切都会按需进行。问题是最大数量为12,但是在某些位置,项目数会更改。这导致我的函数返回0行,而不是返回12行,其中没有数据的所有空行,或者仅返回具有数据的行,并排除空行。两种输出都可以。
我尝试合并一个函数,该函数返回该位置的项目计数以用作for循环的限制,例如:
FOR i IN 0 .. get_COUNT(LOCATION) LOOP
这适用于具有从I = 0开始顺序排列的项目的位置。对于某些项目,其中第一项不在I = 0中,这不起作用。例如,一个位置在I = 1中只有一项。如果我退出循环并仅在I = 1上运行此函数,我将获得该行。当我运行该函数时,由于第一行(I = 0)返回的都是空值,所以我没有表。
CREATE TYPE TEMPROW AS OBJECT(
VAL1 VARCHAR2(5),
VAL2 VARCHAR2(5),
VAL3 VARCHAR2(5),
VAL4 VARCHAR2(5),
VAL5 VARCHAR2(5),
VAL6 VARCHAR2(5),
VAL7 VARCHAR2(5));
CREATE TYPE TABTYPE AS TABLE OF TEMPROW;
CREATE OR REPLACE FUNCTION get_VALUES_TABLE (LOCATION IN VARCHAR2) RETURN TABLE AS
TEMPTAB TABTYPE := TABTYPE();
BEGIN
FOR I IN 0 .. 11 LOOP
TEMPTAB.EXTEND;
TEMPTAB(TEMPTAB.LAST) := TEMPROW(
get_VALUE(LOCATION,1,I),
get_VALUE(LOCATION,2,I),
get_VALUE(LOCATION,3,I),
get_VALUE(LOCATION,4,I),
get_VALUE(LOCATION,5,I),
get_VALUE(LOCATION,6,I),
get_VALUE(LOCATION,7,I));
END LOOP;
RETURN TEMPTAB;
END;
答案 0 :(得分:2)
当然可以。这是一个小例子。最后仅显示测试查询的服务器输出。
drop type my_table_type
/
drop type my_row_type
/
create or replace type my_row_type as object(id number, str varchar2(10), dt date)
/
create or replace type my_table_type as table of my_row_type
/
create or replace function my_function(num_rows integer) return my_table_type
as
l_tab my_table_type := my_table_type();
begin
for i in 1 .. num_rows
loop
l_tab.extend;
l_tab(l_tab.last) := my_row_type(null, null, null);
end loop;
return l_tab;
end;
/
select rownum, t.* from table(my_function(3)) t;
ROWNUM ID STR DT
---------- ---------- ---------- ----------
1
2
3
(我添加了ROWNUM
,所以我们可以看到发生了什么;当然,您可以select * from table(my_function(3))
, 就是将所有行放在{ {1}}。)