2011-05-04 27 views
7

¿Cómo puedo bucle a través de un cursor implícito que se crea, por ejemplo, de una consulta?Bucle a través de un cursor explícito en Oracle

Aquí es el código de ejemplo:

SERVEROUTPUT on; 

DECLARE  
    TYPE ref_cursor IS REF CURSOR; 
    cur REF_CURSOR; 

BEGIN 
    OPEN cur FOR 'SELECT i.item_no, 
         i.item_descr 
        FROM ITEMS i 
       WHERE i.item_no in (1,2,3)'; 

    ... loop statement to print all item descriptions? 

END; 
+1

Ese es un cursor explícito. –

Respuesta

9

Aquí es cómo hacerlo teniendo en SQL dinámico. Puede construir la cadena de consulta hacia arriba en el código como sea necesario (se aplican las advertencias habituales sobre la inyección de SQL).

DECLARE  
    TYPE ref_cursor IS REF CURSOR; 
    cur REF_CURSOR; 

    d_item_no items.item_no%TYPE; 
    d_item_descr items.item_descr%TYPE; 

BEGIN 
    OPEN cur FOR 'SELECT i.item_no, 
         i.item_descr 
        FROM ITEMS i 
       WHERE i.item_no in (1,2,3)'; 
    LOOP 
    FETCH cur INTO d_item_no, d_item_descr; 
    EXIT WHEN cur%NOTFOUND; 
    dbms_output.put_line(d_item_no||' '||d_item_descr); 
    END LOOP; 

    CLOSE cur; 
END; 
/
8

no estoy para arriba en los cambios 11g, pero esto debería funcionar:

BEGIN 

    FOR cur IN (SELECT i.item_no, 
        i.item_descr 
       FROM ITEMS i 
       WHERE i.item_no in (1,2,3)) 
    LOOP 
    DBMS_OUTPUT.PUT_LINE('Row: '|| cur.item_no ||' '|| cur.item_descr); 
    END LOOP; 

END; 
+0

Cómo si los números de posición de la cláusula "IN" vendrán de un valor de cadena de una variable? Por ejemplo: 'seleccione i.tem_no, i.item_descr de artículos i, donde i.item_no en (' || p_items_comma_separated || ')' – rajeemcariazo

+0

y supongo que no soy especialmente en la mesa, siempre y cuando mis alias de columna son item_no y item_descr – rajeemcariazo

+0

@rajeem_cariazo: la cláusula IN' 'no soporta el uso de una variable en lugar de una lista separada por comas - en cualquiera de SQL, es necesario utilizar SQL dinámico para construir la consulta como una cadena antes de que se ejecute. Del mismo modo para el nombre de la tabla en cualquier declaración. La alternativa es crear una tabla derivada que contenga los valores que desee, de modo que pueda unirse contra ella en lugar de utilizar una cláusula 'IN'. –

Cuestiones relacionadas