Возможно, в вашем коде что-то не так, что вы либо не видите в своем вопросе, либо пропустилиПожалуйста, посмотрите ниже ДЕМО, которая находится на аналогичных строках вашего вопроса.Я использовал его так же, как вы, и он отлично работает на 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
вне области действия пакета, и тогда оно должно работать.