2017-07-06 109 views
0

我在使用可變參數掙扎存儲過程必須使用在其WHERE子句中傳遞給它的每個參數對錶執行SELECT操作。Oracle SQL - 具有可變參數的SELECT存儲過程

基本上我有N帳號作爲參數,我想返回一個表,每個帳號選擇三個字段的結果。

這是我迄今所做的:

function sp_get_minutes_expiration_default(retval IN OUT char, gc IN OUT GenericCursor, 
     p_account_num IN CLIENT_ACCOUNTS.ACCOUNT_NUM%TYPE) return number 
     is 
    r_cod integer := 0; 
    begin 
     open gc for select account_num, concept_def, minutes_expiration_def from CLIENT_ACCOUNTS 
      where p_account_num = account_num; -- MAYBE A FOR LOOP HERE? 
     return r_cod; 
    exception 

     -- EXCEPTION HANDLING 

    end sp_get_minutes_expiration_default; 

我的蠻力解決方案是可能遍歷帳號,選擇列表,也許做一個UNION或追加到結果表?

回答

1

如果你投你的輸入參數作爲一個表,那麼你可以加入到CLIENT_ACCOUNTS

select account_num, concept_def, minutes_expiration_def 
from CLIENT_ACCOUNTS ca, table(p_account_num) a 
where a.account_num = ca.account_num 

但我會建議你選擇輸出到另一個集合,是函數(或程序)的輸出。我會敦促你不要使用引用遊標。

附錄1

一個更完整的示例如下:

create or replace type id_type_array as table of number; 
/

declare 
    ti id_type_array := id_type_array(); 
    n number; 
begin 
    ti.extend(); 
    ti(1) := 42; 
    select column_value into n from table(ti) where rownum = 1; 
end; 
/

在你的代碼,你將需要使用框架的API:

  1. 創建集合的一個實例(類型id_type_array)
  2. 用數字列表填充集合
  3. 執行匿名PL/SQL塊,收集

的約束力,但你應該立即看到你沒有把查詢到的匿名PL/SQL塊來執行它(即使許多有經驗的Oracle開發者提倡它)。只要您綁定正確的參數,您可以執行查詢,就像任何其他查詢:

select account_num, concept_def, minutes_expiration_def 
from CLIENT_ACCOUNTS ca, table(:p_account_num) a 
where a.column_value = ca.account_num 
+0

@ jeff5times7在這短短的例子p_account_num應該是什麼類型,SQL LIST的?我一直在閱讀關於TABLE()函數的內容,但我不太明白它需要什麼參數。請你再擴充一點嗎? – Franch

+0

請參閱附錄1。 – jeff6times7