2011-05-04 46 views
7

如何循环通过例如查询创建的隐式游标?循环遍历Oracle中的显式游标

下面是示例代码:

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

这是一个明确的游标。 – 2011-05-05 01:37:40

回答

9

这里是如何做到这一点,允许动态SQL。您可以在代码中构建查询字符串,但需要(通常有关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

我不起来11g的变化,但这应该工作:

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

如果“IN”子句中的项目编号来自变量的字符串值?例如:'从i.item_no('|| p_items_comma_separated ||')' – rajeemcariazo 2011-05-04 04:30:26

+0

'中选择i.tem_no,i.item_descr,假设我对该表格没有特殊要求,只要我的列别名是item_no,并且item_descr – rajeemcariazo 2011-05-04 04:32:38

+0

@rajeem_cariazo:'IN'子句不支持使用变量来代替逗号分隔列表 - 在任何SQL中,您需要使用动态SQL将查询构造为字符串,然后执行。同样在任何声明中的表名。另一种方法是建立一个包含你想要的值的派生表,这样你就可以加入它而不是使用'IN'子句。 – 2011-05-04 04:46:04