【问题标题】:Loop through an explicit cursor in Oracle循环遍历 Oracle 中的显式游标
【发布时间】:2011-08-18 04:49:07
【问题描述】:

我如何循环通过例如从查询中创建的隐式游标?

这里是示例代码:

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;

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    这是允许动态 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;
    /
    

    【讨论】:

      【解决方案2】:

      我不支持 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;
      

      【讨论】:

      • 如果“IN”子句中的项目编号来自变量的字符串值怎么办?例如:'select i.tem_no, i.item_descr from items i where i.item_no in (' || p_items_comma_separated || ')'
      • 假设我对表格并不特别,只要我的列别名是 item_no 和 item_descr
      • @rajeem_cariazo:IN 子句不支持使用变量代替逗号分隔的列表 - 在任何 SQL 中,您需要使用动态 SQL 将查询构造为字符串,然后才能执行。对于任何语句中的表名也是如此。另一种方法是构建一个包含所需值的派生表,这样您就可以加入它而不是使用IN 子句。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2017-10-01
      • 2018-12-06
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多