Если тип коллекции объявлен на уровне схемы, его можно использовать в инструкциях SQL, включая динамические.Вам нужно явно привести его к правильному типу коллекции, или движок SQL не знает, какой это тип.
EXECUTE IMMEDIATE
'SELECT COUNT(*) FROM TABLE(CAST(:collection AS collection_type))'
INTO l_count
USING l_collection
;
Я не уверен, есть ли другая причина, по которой вы хотите использовать динамический SQL,или если вы просто предполагаете, что это необходимо в этом случае.Это не должно быть необходимо, если все, что вы хотите сделать, это выбрать количество.Этот встроенный SQL должен работать нормально:
SELECT COUNT(*) INTO l_count FROM TABLE(CAST(l_collection AS collection_type));
Конечно, если это все, что вам нужно, SQL вообще не нужен, просто l_count := l_collection.COUNT
.
Редактироватьдобавление полностью проработанного примера
CREATE OR REPLACE TYPE testtype AS OBJECT( x NUMBER, y NUMBER);
/
CREATE OR REPLACE TYPE testtypetab AS TABLE OF testtype;
/
DECLARE
t testtypetab := testtypetab();
l_count integer;
BEGIN
-- Populate the collection with some data
SELECT testtype(LEVEL, LEVEL) BULK COLLECT INTO t FROM dual CONNECT BY LEVEL<21;
-- Show that we can query it using inline SQL
SELECT count(*) INTO l_count FROM TABLE(CAST(t AS testtypetab));
dbms_output.put_line( l_count );
-- Clear the collection
t.DELETE;
-- Show that we can query it using dynamic SQL
EXECUTE IMMEDIATE 'select count(*) from table(cast(:collection as testtypetab))'
into l_count using t;
dbms_output.put_line( l_count );
END;
/