我想使用单个光标来使用where条件获取单个记录或所有记录,例如:student
是表,sid
是属性。
我有两个光标,
DECLARE S1 CURSOR FOR SELECT * FROM Student;
和
Declare S2 Cursor for select * from Student where sid=11
我的问题是如何将这两个条件组合起来只使用一个游标。我需要这个,因为我有两个函数m_viewStudent
和m_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打开引用游标,这是一种强大的技术。
阅读文档以了解更多信息。