0

単一のカーソルを使用して、where 条件を使用して単一のレコードまたはすべてのレコードをフェッチしたい。たとえば、:studentはテーブルでsidあり、属性である。

私は2つのカーソルを持っています、

DECLARE S1 CURSOR FOR SELECT * FROM Student;

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

私の質問は、これら 2 つの条件を組み合わせて 1 つのカーソルのみを使用する方法です。2 つの関数m_viewStudentm_viewallStudentsがあるため、これが必要です。このため、テーブルから要求された詳細を表示するために 1 つのカーソルのみを使用したいと考えています。

どうすればこれを達成できますか?

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ステートメントを変更できることです。

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を使用して参照カーソルを開くこともできます。

詳細については、ドキュメントをお読みください

于 2013-02-03T11:58:57.060 に答える
0

カーソルを次のように変更できます。

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

これにより、関数m_viewStudentがこれを呼び出すときに、sid (この関数 variable_from_function に送信される値) レコードのみが選択されるようになります。これm_viewallStudentsを呼び出すと、variable_from_function が null になるため、すべてのレコードが選択されます。

于 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 に答える