【问题标题】:PL/SQL - How to create a conditional cursor?PL/SQL - 如何创建条件游标?
【发布时间】:2010-10-19 13:53:35
【问题描述】:

我需要一个条件光标,比如:

  • 如果存在一行(使用 WHEN EXISTS 或类似的东西),那么我的光标是:
    • CURSOR varCursor IS SELECT 1 a FROM DUAL;
  • 其他
    • CURSOR varCursor IS SELECT 2 a FROM DUAL;

但是看,我不想改变一个列结果,我想改变整个光标。

下面我举一个更大的例子。

谢谢!


见:

SET serveroutput ON SIZE 900000;
DECLARE
  CURSOR varCursor IS SELECT 1 a FROM DUAL;
  -- CURSOR varCursor IS SELECT 2 a FROM DUAL;
BEGIN
  FOR varRow IN varCursor LOOP
    dbms_output.put_line('row: ' || varRow.a);
  END LOOP;
  dbms_output.put_line('Done.');  
END;

【问题讨论】:

    标签: oracle plsql database-cursor


    【解决方案1】:

    除非将它放入一个查询中(如 Tony 建议的那样),因为您想要一个游标结果,您可以这样做(这会将游标切换到您需要的逻辑 --> 一种游标解决方案)

    DECLARE
      PROCEDURE CURSORCHOICE(ITEM IN NUMBER) IS
          L_REFCUR SYS_REFCURSOR;
        returnNum number;
        BEGIN
            IF NVL(ITEM,0) > 0 THEN
                OPEN L_REFCUR FOR
                SELECT ITEM * level  FROM DUAL 
                CONNECT BY LEVEL < ITEM ;
            ELSE
                OPEN L_REFCUR FOR
                SELECT  ITEM -  LEVEL  FROM DUAL 
                connect by level < -1 * ITEM ;  
            END IF;
            dbms_output.put_line('Results to item ' || item);
          loop
             fetch l_refcur into returnNum;
             exit when l_refcur%notfound;
             dbms_output.put_line(returnNum);
          end loop;
          CLOSE L_REFCUR;
    
        END ;
    BEGIN
    CURSORCHOICE(5);
    CURSORCHOICE(-5);
    end ;
    /
    
    Results to item 5
    5
    10
    15
    20
    Results to item -5
    -6
    -7
    -8
    -9
    

    【讨论】:

      【解决方案2】:

      从字面上看,你可以这样做:

      CURSOR varCursor IS SELECT 1 a FROM DUAL WHERE EXISTS (...)
                          UNION
                          SELECT 2 a FROM DUAL WHERE NOT EXISTS (...);
      

      但是,拥有 2 个光标并打开合适的光标会更简单,也可能更有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-30
        • 2023-04-06
        • 2014-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多