2013-02-03 215 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.