2011-03-08 22 views
5

¿Es posible crear una instrucción SQL dinámica que extraiga de una colección existente?ORACLE PL/SQL: Selección de SQL dinámico utilizando una colección

l_collection := pack.get_items(
       i_code => get_items_list.i_code , 
       i_name => get_items_list.i_name); 

Ahora, digamos que quiero seleccionar un COUNT de esa colección usando SQL dinámico. ¿Es eso posible? Además, quiero hacer una sub selección de esa colección también.

Respuesta

6

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; 
/
+0

Hmm ... no parece funcionar. Sigue dándome una expresión de error de tipo incorrecto. – jlrolin

+0

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. –

+0

Sí, algo no funciona con mi instalación de SQL Developer. Recibo este error incluso si elimino el código. – jlrolin

Cuestiones relacionadas