2013-02-03 85 views
0

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

我有两个光标,

DECLARE S1 CURSOR FOR SELECT * FROM Student;

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

我查询是如何将这两个条件结合起来,只用一个鼠标。我需要这个,因为我有两个函数m_viewStudentm_viewallStudents,为此我想只使用一个游标来显示表中请求的细节。

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

+2

为什么这会被关闭为“off topic”?这个问题似乎决定于编程和软件开发。如果没有,有很多SQL问题需要关闭... –

回答

2

试试这个:

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

Here is a sqlfiddle demo


UPDATE

如果您要使用不同的功能相同的游标,那么你可以做这样的:

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

让我解释一下,我有两个函数m_viewStudent,m_viewallStudents为此我想只使用一个游标来显示表中请求的细节,所以我怎么能做到这一点? – User12344

+0

谢谢你,你的第一个查询解决了我的问题 – User12344

0

您可以将光标移到

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

这将确保当函数调用m_viewStudent此,只有SID(发送到这个功能variable_from_function值)记录采摘。当m_viewallStudents调用此选项时,所有记录都会被选中,因为variable_from_function将为空。

+0

谢谢@Orangecrush我也解决了问题并编辑了我的问题 – User12344

+0

@Venkatesh很高兴能有所帮助。如果它正在工作,upvote并将答案标记为可供进一步参考,并帮助其他有类似问题的人。 – Orangecrush

0

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

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

而且在空传递,当你希望他们所有的,或者使参数为空的默认值,并通过在没有参数

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表的投影的查询。 (如果你没有一个学生实际表,你可以使用的意见或定义一个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,这是一个强大的技术。

阅读文档至find out more.