Ошибка компиляции типа таблицы PL / SQL - PullRequest
0 голосов
/ 29 мая 2018

У меня есть типы таблиц:

CREATE OR REPLACE TYPE "TABLE_OF_VARCHAR2" AS TABLE OF VARCHAR2(4000);
CREATE OR REPLACE TYPE "TABLE_OF_NUMBER" AS TABLE OF NUMBER;

И в моем теле пакета есть курсор:

cursor c_src_m(trans_list table_of_number, v_codes table_of_varchar2, ...) is
    select ....something
    where ....
    --AND ta.id in (select COLUMN_VALUE from TABLE(trans_list))
    --AND (tb.UNDERLYING_VALUE in (select COLUMN_VALUE from TABLE(v_codes)) OR (v_codes is null or (select count(1) from TABLE(v_codes)) = 0))

Для каждой из последних 2 строк, если я раскомментирую их, я получаю ошибку:

ORA-22905: невозможно получить доступ к строкам из элемента не вложенной таблицы * Причина: попытка получить доступ к строкам элемента, тип которого неизвестен во время анализа или не принадлежит вложенной таблицетип * Действие: используйте CAST для приведения элемента во вложенную таблицу типа

Я искал решение в течение 3 часов, но все еще не смог найти работающее.Мне действительно нужно разыграть, как говорится в сообщении об ошибке?Кто-нибудь знает в чем здесь проблема?

1 Ответ

0 голосов
/ 29 мая 2018

Возможно, в вашем коде что-то не так, что вы либо не видите в своем вопросе, либо пропустилиПожалуйста, посмотрите ниже ДЕМО, которая находится на аналогичных строках вашего вопроса.Я использовал его так же, как вы, и он отлично работает на Oracle11g.Также вы можете использовать MEMBER OF вместо запроса оператора Select в предложении where.См. Ниже и прочитайте мои встроенные комментарии, чтобы понять больше.

Создание таблиц и типов:

CREATE OR REPLACE TYPE TABLE_OF_VARCHAR2 AS TABLE OF VARCHAR2(4000);
/
CREATE OR REPLACE TYPE TABLE_OF_NUMBER AS TABLE OF NUMBER;
/

Create table Num_varchar(col1 number, col2 varchar2(1000));
/
INSERT ALL 
INTO Num_varchar VALUES (1,'A')
INTO Num_varchar VALUES (2,'B')
INTO Num_varchar VALUES (3,'C')
INTO Num_varchar VALUES (4,'D')
INTO Num_varchar VALUES (5,'E')
SELECT * FROM dual;
/

Блок:

DECLARE
  CURSOR c_src_m(trans_list table_of_number, v_codes table_of_varchar2)
  IS
    SELECT col1,
           col2
    FROM Num_varchar
     --Inplace of select query you can use Member of as well. However if you want to use select query, this will also work. 
    --WHERE col1 IN  (SELECT COLUMN_VALUE FROM TABLE(trans_list) )
    --AND col2 IN   (SELECT COLUMN_VALUE FROM TABLE(v_codes));
    WHERE col1 MEMBER OF trans_list
    and col2 MEMBER OF v_codes;

  --Populated the collection so that i can use it in my query above 
  var_varchr2 TABLE_OF_VARCHAR2:=TABLE_OF_VARCHAR2('A','B','C','D');
  var_number TABLE_OF_NUMBER   :=TABLE_OF_NUMBER(1,2,3,4);
  var1 NUMBER;
  var2 VARCHAR2(100);

BEGIN
 OPEN c_src_m ( var_number , var_varchr2);  

    LOOP
      FETCH c_src_m INTO var1,var2;
    EXIT WHEN c_src_m%NOTFOUND;
     --dispalying the result of the cursor
    dbms_output.put_line(var1 || var2);
  END LOOP;
  Close c_src_m;
END;

Вывод:

1A
2B
3C
4D

Примечание. Если вы создали типы в спецификации пакета, это не сработает.До Oracle11g любые типы, созданные в области действия PLSQL, нельзя ссылать в операторе SQL внутри блока PLSQL.Если вы сделали это, просто создайте types вне области действия пакета, и тогда оно должно работать.

...