Почему тип не может быть ограничен? - PullRequest
0 голосов
/ 05 июля 2018


Я борюсь со следующим кодом:

DECLARE
  TOTACID TAB_OF_ID(50);
  RES NUMBER;
BEGIN
  SELECT DISTINCT ID INTO TOTACID
  FROM TABLE_B;

  FOR indx IN 1 .. TOTACID.COUNT
    LOOP
      RES := F_IMPORT(TOTACID(indx));
      DBMS_OUTPUT.PUT_LINE ('Moved ID ' || RES);
    END LOOP;

END;
/

Когда я его запускаю, происходит сбой с ошибкой:

Сообщение об ошибке - ORA-06550: строка 2, столбец 11: PLS-00566: имя типа "TAB_OF_ID" не может быть ограничено ORA-06550: строка 5, колонка 19: PL / SQL: ORA-00932: несовместимые типы данных: ожидаемый UDT получил NUMBER ORA-06550: строка 5, колонка 3: PL / SQL: оператор SQL игнорируется 06550. 00000 - «строка% s, столбец% s: \ n% s» * Причина: обычно ошибка компиляции PL / SQL. * Действие:

Где TAB_OF_ID было объявлено следующим образом:

create or replace TYPE TAB_OF_ID AS table of NUMBER(19,2);

Я не понимаю, что не так. Кажется, я не могу объявить TOTACID TAB_OF_ID(50), но в функции, которую я создал несколько дней назад, я могу объявить LIS_ID TAB_OF_ID := TAB_OF_ID(50);, и она работает правильно. В чем разница со сценарием, который у меня здесь?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Очевидно, TOTACID TAB_OF_ID(50) отличается от LIS_ID TAB_OF_ID := TAB_OF_ID(50); Команда похожа на

{variable name} {data type} := {inital value};

, где := {inital value} необязательно.

TOTACID TAB_OF_ID(50) будет означать

{variable name} {inital value};

неверный синтаксис.

0 голосов
/ 05 июля 2018

Вы не можете объявить переменную, назначив вашей таблице фиксированное количество записей, поэтому вам нужно что-то вроде:

DECLARE
  TOTACID TAB_OF_ID;
  RES NUMBER;
BEGIN
  SELECT DISTINCT ID bulk collect INTO TOTACID
  FROM TABLE_B;
  ...
END;
/

Также обратите внимание, что вы выбираете более одного значения, поэтому вам нужно BULK COLLECT INTO.

О

LIS_ID TAB_OF_ID := TAB_OF_ID(50);

здесь вы не объявляете переменную с заданным числом записей, а присваиваете переменную 50-е значение таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...