0

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

我有两个光标,

DECLARE S1 CURSOR FOR SELECT * FROM Student;

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

我的查询是关于如何结合这两个条件以仅使用一个游标。我需要这个,因为我有两个功能m_viewStudentm_viewallStudents为此我只想使用一个光标来显示表中请求的详细信息。

那么我该如何实现呢?

4

4 回答 4

2

试试这个:

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

这是一个 sqlfiddle 演示


更新

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

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;
/
于 2013-02-03T06:00:52.917 回答
0

您可以将光标更改为

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

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

于 2013-02-03T06:46:14.050 回答
0

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

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

并在需要时传入 null,或者将参数的默认值设为 null 并且不传入任何参数

于 2013-02-03T09:00:51.060 回答
0

最好的方法是使用游标变量,通常称为参考游标。这基本上是一个指向结果集的指针。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,这是一种强大的技术。

阅读文档以了解更多信息。

于 2013-02-03T11:58:57.060 回答