Как дать вложенную таблицу в качестве параметра по умолчанию? - PullRequest
2 голосов
/ 16 февраля 2020

У меня есть функция, которая принимает вложенную таблицу и целое число в качестве параметра.

Я могу создать любой аргумент по умолчанию для целочисленного параметра. Но для вложенной таблицы я могу дать только пустую таблицу.

function  a return packageName.tOfmyrecord(i in integer:=2,j in integer:=2, k in tableofmyrecord2 package.n)  PIPELINED
is 
begin
    --do its work
end

PLS-00653: агрегатные / табличные функции не разрешены

Я хочу дать в качестве параметра по умолчанию - результат функции b, которая возвращает вложенную таблицу. Это решение работает. Но это громоздко. Как я могу сделать лучше?

function  a return packageName.tOfmyrecord  PIPELINED
is
        c packageName.myrecord;
        m_cur SYS_REFCURSOR;
begin
        OPEN m_cur FOR select * from table(  
             packageName.a(2,2,  packageName.b)); --I give the 3 default parameters. 2,2 for the integer and the table returns by the funciton b
        loop
            fetch m_cur into c;
            exit when m_cur%notfound;
            PIPE ROW(c);    
        end loop;
        close  m_cur;
 end;

Я тоже пробовал это решение, но оно не работает. Возможно, нужно изменить только немного, чтобы он работал -

function  a return packageName.a  PIPELINED
is
begin
      return packagename(2,2,packagename.b);
end;

PLS_00633: оператор возврата в конвейерной функции не может содержать выражения.

1 Ответ

3 голосов
/ 17 февраля 2020

Создайте тип коллекции в области действия SQL:

CREATE TYPE stringlist IS TABLE OF VARCHAR2(20);

Затем вы можете использовать его в операторах SQL и в PL / SQL (тогда как, если вы определяете коллекцию в PL / SQL scope, тогда вы можете использовать его только в PL / SQL).

Затем вы можете определить спецификацию вашего пакета:

CREATE PACKAGE test_package IS
  FUNCTION test_fn(
    a IN INTEGER    DEFAULT 1,
    b IN stringlist DEFAULT stringlist('a','b','c')
  ) RETURN stringlist PIPELINED;
END;
/

И тело пакета:

CREATE PACKAGE BODY test_package IS
  FUNCTION test_fn(
    a IN INTEGER    DEFAULT 1,
    b IN stringlist DEFAULT stringlist('a','b','c')
  ) RETURN stringlist PIPELINED
  IS
  BEGIN
    IF b IS NULL THEN
      RETURN;
    END IF;

    FOR i IN 1 .. b.COUNT LOOP
      PIPE ROW ( b(i) || a );
    END LOOP;
  END;
END;
/

И использовать его в SQL с аргументами по умолчанию:

SELECT *
FROM   TABLE( test_package.test_fn() );

Какие выходные данные:

| COLUMN_VALUE |
| :----------- |
| a1           |
| b1           |
| c1           |

Или предоставить свои собственные аргументы :

SELECT *
FROM   TABLE(
         test_package.test_fn(
           b => stringlist('d','e','f','g')
         )
       );

Какие выходы:

| COLUMN_VALUE |
| :----------- |
| d1           |
| e1           |
| f1           |
| g1           |

db <> Fiddle здесь

...