Si el tipo de recopilación se declara a nivel de esquema, se puede usar en sentencias SQL, incluidas las dinámicas. Necesita lanzarlo explícitamente al tipo de recopilación adecuado, o el motor SQL no tiene idea de qué tipo es.
EXECUTE IMMEDIATE
'SELECT COUNT(*) FROM TABLE(CAST(:collection AS collection_type))'
INTO l_count
USING l_collection
;
no estoy seguro si hay alguna otra razón que desea utilizar SQL dinámico, o si sólo está asumiendo que es necesario en este caso. No debería ser necesario si todo lo que quiere hacer es seleccionar el recuento. Esta línea de SQL debería funcionar bien:
SELECT COUNT(*) INTO l_count FROM TABLE(CAST(l_collection AS collection_type));
Por supuesto, si eso es todo lo que quiera que no es necesario SQL en absoluto, sólo l_count := l_collection.COUNT
.
Editar - Agregar totalmente resuelto ejemplo
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;
/
Hmm ... no parece funcionar. Sigue dándome una expresión de error de tipo incorrecto. – jlrolin
Agregué un ejemplo más completo que se ejecuta con éxito para mí. Parece que "la expresión es de tipo incorrecto" generalmente significa que estás tratando de asignar un objeto a una variable no objeto o viceversa. Si todavía tiene problemas, quizás deba publicar una pequeña muestra de código que muestre su problema específico. –
Sí, algo no funciona con mi instalación de SQL Developer. Recibo este error incluso si elimino el código. – jlrolin