【问题标题】:Oracle-sql query [closed]Oracle-sql 查询 [关闭]
【发布时间】:2023-03-09 00:54:01
【问题描述】:

我想使用单个游标来获取单个记录或使用 where 条件的所有记录,例如: student 是表,sid 是一个属性。

我有两个光标,

DECLARE S1 CURSOR FOR SELECT * FROM Student;

Declare S2 Cursor for select * from Student where sid=11

我的问题是如何结合这两个条件以仅使用一个光标。我需要这个,因为我有两个函数m_viewStudentm_viewallStudents,为此我只想使用一个光标来显示表中请求的详细信息。

那么我该如何实现呢?

【问题讨论】:

  • 为什么会因为“离题”而关闭?这个问题似乎与编程和软件开发有关。如果没有,有很多 SQL 问题需要关闭...

标签: oracle oracle10g oracle11g proc


【解决方案1】:

试试这个:

select * 
from student
where sid = 11 
or not exists (select 1 from student where sid = 11)

Here is a sqlfiddle demo


更新

如果你想为不同的功能使用相同的光标,那么你可以这样做:

create package p is

  procedure one_sid(in_sid number);
  procedure all_sid;

end p;
/

create package body p is

  cursor c(p_sid number) is
  select * 
    from student 
   where sid = p_sid or p_sid is null;

  procedure one_sid(in_sid number) is

  begin

   open c(in_sid);

   close c;

  end;

  procedure all_sid is

  begin

   open c(null);

   close c;

  end;

end p;
/

【讨论】:

  • 让我解释一下,我有两个函数 m_viewStudent,m_viewallStudents 为此我只想使用一个光标来显示表中请求的详细信息,那么我该如何实现呢?
  • 谢谢你,你的第一个问题解决了我的问题
【解决方案2】:

您可以将光标更改为

SELECT * FROM students WHERE sid like '%' || variable_from_function || '%';

这将确保当函数m_viewStudent 调用它时,只会选择 sid(发送到此函数 variable_from_function 的值)记录。当m_viewallStudents 调用它时,所有记录都会被选中,因为 variable_from_function 将为空。

【讨论】:

  • 谢谢@Orangecrush 我得到了解决方案并编辑了我的问题
  • @Venkatesh 很高兴能提供帮助。如果它有效,请投票并将答案标记为已接受,以供进一步参考并帮助其他有类似问题的人。
【解决方案3】:

假设你的过程变量是$var,试试这个:

Declare S2 Cursor for select * from Student 
    where sid=$var 
        or $var is null

当你想要它们全部时传入一个null,或者将参数的默认值设为null并且不传入任何参数

【讨论】:

    【解决方案4】:

    最好的方法是使用游标变量,通常称为参考游标。这基本上是一个指向结果集的指针。 Ref Cursor 的优点是我们可以改变 select 语句,如下所示:

    create or replace package student_utils is
    
       --  a hard-types ref cursor
       type stud_cur is ref cursor return students%rowtype;
       function get_students 
          ( p_sid in students.sid%type  := null )
          return  stud_cur;
    end;
    

    请注意,我对您打算如何使用代码做出了一些假设。使用包允许我们定义硬类型引用游标,这意味着它只能用于与 STUDENTS 表的投影匹配的查询。 (如果您没有实际的 STUDENTS 表,则可以使用视图或定义 Pl/SQL 记录。)

    create or replace package body student_utils is
    
       function get_students 
          ( p_sid in students.sid%type := null )
          return  stud_cur
       is
           return_value stud_cur;
       begin
           if p_sid is null
           then
               open return_value for 
                    select * from m_viewallStudents;
           else
               open return_value for 
                    select * from m_viewStudent
                    where sid = p_sid;
           end if;  
           return return_value;
        end;
    end;
    

    这些查询是硬编码的,但我们也可以使用动态 SQL 打开 Ref Cursors,这是一种强大的技术。

    阅读文档至find out more.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多