Oracle sql查询

Oracle sql查询,oracle,oracle10g,oracle11g,proc,Oracle,Oracle10g,Oracle11g,Proc,我想使用单个游标来获取单个记录或使用where条件的所有记录,例如:student是表,sid是属性 我有两个光标 为学生选择*声明S1光标 及 为sid=11的学生选择*声明S2光标 我的问题是如何结合这两个条件,只使用一个游标。我需要这个,因为我有两个函数m_viewStudent和m_viewallStudents,为此,我只想使用一个光标来显示表中请求的详细信息 那么我如何才能做到这一点呢?试试这个: select * from student where sid = 11 or n

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

我有两个光标

为学生选择*声明S1光标

为sid=11的学生选择*声明S2光标

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

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

试试这个:

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


更新

如果要对不同的函数使用同一个光标,则可以如下操作:

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

您可以将光标更改为

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

这将确保当函数
m_viewstudion
调用此函数时,仅拾取sid(从函数发送到此函数变量的值)记录。当
m_viewallStudents
调用此函数时,从函数中选取为变量的所有记录都将为空。

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

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

并在需要时传入null,或者将参数的默认值设为null,然后不传入任何参数。最好的方法是使用游标变量,通常称为Ref Cursor。这基本上是一个指向结果集的指针。Ref游标的优点是我们可以改变select语句,如下所示:

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;
/
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记录。)

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


阅读文档,让我解释一下,我有两个功能m_VIEW Student,m_viewallStudents为此,我只想使用一个光标来显示表格中所需的详细信息,那么我如何才能做到这一点?谢谢您,您的第一个查询解决了我的问题谢谢@Orangecrush我得到了解决方案并编辑了我的问题too@Venkatesh很高兴能帮上忙。如果它是有效的,请投票并将答案标记为已被接受,以供进一步参考,并帮助其他有类似问题的人。为什么这会被关闭为“离题”?这个问题显然与编程和软件开发有关。如果不是,那么有很多SQL问题需要解决。。。