Oracle-sql query



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

我有两个光标,

DECLARE S1 CURSOR FOR SELECT * FROM Student;

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

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

那么我该如何做到这一点呢?

试试这个:

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;
/

您可以将光标更改为

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

这将确保当函数m_viewStudent调用此时,只拾取sid(发送到此函数variable_from_function的值)记录。当m_viewallStudents调用此函数时,由于variable_from_function将为null,所有记录都将被拾取。

假设您的过程变量是$var,请尝试以下操作:

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

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

最好的方法是使用Cursor变量,通常称为Ref Cursor。这基本上是一个指向结果集的指针。RefCursor的优点是我们可以改变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;

请注意,我已经对您打算如何使用该代码做出了一些假设。使用包可以定义硬类型的ref游标,这意味着它只能用于与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打开引用游标,这是一种强大的技术。

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

相关内容

  • 没有找到相关文章

最新更新