【问题标题】:Cursor in if statement - Oracle PLSQLif 语句中的光标 - Oracle PLSQL
【发布时间】:2021-11-26 15:24:03
【问题描述】:

如何在Oracle plsql的if语句中使用游标?

如果参数 P_USER_ID 不为空 cursor = P_USER_ID 否则从表中获取所有用户。

If P_USER_ID is not null then
   cursor c_user is Select P_USER_ID from dual;
else 
   cursor c_user is Select * from users;
end if;

PLS-00103:在预期以下情况之一时遇到符号“IF”:开始函数杂注过程子类型类型当前光标删除之前存在符号“开始”替换“IF”以继续。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    你可以这样做

    create or replace procedure get_users( p_user_id in integer,
                                           p_rc     out sys_refcursor )
    as
    begin
      If P_USER_ID is not null then
        open p_rc for 'Select P_USER_ID from dual';
      else 
        open p_rc for 'Select * from users';
      end if;
    end;
    

    请注意,使用分支逻辑生成不同形状的游标(不同的列数、不同的列名、不同的数据类型)通常会使尝试使用该游标的任何代码变得更加复杂。也许你真的想写一个查询

    cursor c_user 
        is select user_id, username from users where p_user_id is null
           union all
           select p_user_id, null from dual where p_user_id is not null
    

    【讨论】:

      【解决方案2】:

      游标在不允许IFs 的声明 部分中声明。但是,你可以这样做:

      cursor c_user is
        select p_user_id from dual  where p_user_id is not null
        union all
        select user_id   from users where p_user_id is     null;
          
      

      请注意,您选择 * from user 的想法不会真正起作用,因为同一个光标 (c_user) 不能只有一列(您的第一个光标)或“许多”列(第二个)。

      这就是我的示例使用union 的原因,其中select 语句必须具有与列数及其数据类型匹配的列列表;这也意味着p_user_idusers.user_id 应该具有相同的数据类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        相关资源
        最近更新 更多