表格函数是否可以返回空行?

时间:2019-08-30 17:16:43

标签: sql oracle

我目前有一个表函数可以返回数据表。该数据由内部的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;

1 个答案:

答案 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}}。)