Выражение неправильного типа при отправке вложенного массива в функцию - PullRequest
0 голосов
/ 24 мая 2019

Я хочу отправить коллекцию в функцию, но получаю сообщение об ошибке.

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

Бороться с этим в течение неделитеперь любая помощь приветствуется.

Точная ошибка:

ORA-06550: line 9, column 45:
PLS-00382: expression is of wrong type
ORA-06550: line 9, column 40:
PLS-00306: wrong number or types of arguments in call to 'TEST_F'
ORA-06550: line 9, column 23:
PL/SQL: ORA-00904: "PACKAGE_SS"."TEST_F": invalid identifier
ORA-06550: line 9, column 3:
PL/SQL: SQL Statement ignored

Заголовок:

create or replace 
PACKAGE PACKAGE_SS AS

type t_itemnumber is table of varchar2(100) index by BINARY_INTEGER;
type t_alternative_rec is record
(
  itemnumber t_itemnumber
);

type t_alternative_prev is table of t_alternative_rec INDEX BY BINARY_INTEGER;

type t_procestype_rec is record
(
  procestype char
);

TYPE result_table IS TABLE OF t_procestype_rec;
FUNCTION test_f(p_items_prev IN t_alternative_prev) RETURN result_table PIPELINED;

END AOPA_VALIDATE_SS;

Тело пакета выглядит следующим образом:

создать или заменить

PACKAGE BODY PACKAGE_SS AS

FUNCTION test_f(p_items_prev IN t_alternative_prev) RETURN result_table PIPELINED IS
     processType char(1) := 'U';
     rec t_procestype_rec :=null;
   BEGIN
    DBMS_OUTPUT.PUT_LINE('ENTERD ');
      if  (processType= 'U') then
         select 'U' into rec from dual;
       end if;
       if  (processType='C') then
         select 'C' into rec from dual;
       end if;
       if  (processType='D') then
         select 'D' into rec from dual;
       end if;
       pipe row (rec);
       return;
   END test_f;
END PACKAGE_SS;

Использование сценария plsql:

DECLARE
  prev_rev_alternatives PACKAGE_SS.t_alternative_prev;

BEGIN
  prev_rev_alternatives(1).itemnumber(10) := 'PR454545';
  prev_rev_alternatives(1).itemnumber(20) := 'PR333333';


  SELECT * FROM table(PACKAGE_SS.test_f(prev_rev_alternatives));
END;

1 Ответ

0 голосов
/ 25 мая 2019

На мои глаза падают две вещи:

Использование SELECT без INTO в анонимном блоке PLSQL не должно работать.

Для использования типов в операторе SQL требуется тип, определенный как объект, а не в спецификации пакета.

Попробуйте

CREATE TYPE

https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_8001.htm

и

SELECT * INTO ... FROM ...

Это может помочь.

...