2016-09-17 243 views
0

我的問題是非常基本的,但我完全是存儲過程的新手,需要快速解決。任何幫助將不勝感激,Oracle存儲過程

下面是當前的存儲過程,我們有,

PROCEDURE get_something(
type IN VARCHAR2, 
value IN VARCHAR2, 
i_type OUT VARCHAR2, 
i_id OUT VARCHAR2) 
AS 
TYPE t_array 
IS 
    TABLE OF VARCHAR2(320); 
    identifers t_array; 
    column_name VARCHAR2(32); 
    info_qry VARCHAR2(500); 
    top_row_qry VARCHAR2(500); 
BEGIN 
identifers := t_array('ABC'); 
column_name := get_column_name(type); 

info_qry := 'select INS.i_id, INS.model from table1 INS where INS.'||column_name||'='''||value||''' order by INS.version desc'; 


top_row_qry := 'select * from ('||info_qry||') where rownum<=1'; 

EXECUTE immediate top_row_qry INTO i_id, i_type; 

EXCEPTION 
WHEN OTHERS THEN 
i_id := NULL; 
i_type := NULL; 
END get_something; 

現在,當我執行這個程序,它給了我一個記錄由於ROWNUM條件。

我的要求是從top_row_qry中刪除rownum,所以結果會是多行。

我想將每個字段存儲到某個變量中,我將使用其中一個變量在過程本身中進行一些比較。

所以基本上我想存儲的結果,我可以稍後循環,並與值列表進行比較。

此外,我需要在此過程本身中定義值的列表。

類似下面:

list_of_vals:= t_array('ABC','XYZ'); 

任何人都可以幫助我在此。

+2

https://www.techonthenet.com/oracle/loops/cursor_for.php – OldProgrammer

+0

是由OldProgrammer提到 - 該解決方案是,當一個以上的行是在PL/SQL – Pat

+1

被操縱使用遊標使用'bulk collect'進行收集 –

回答

0

我想你需要使用光標作爲您的過程的OUT參數,並在以後使用它來滿足您的要求。

亦作「我需要定義在這個過程本身。值列表」 你可以使用一個集合我已經在程序代碼(v_array)所使用的方式。 然後,您可以使用循環遍歷v_array的多個值。

CREATE ORE REPLACE PROCEDURE get_something(type IN VARCHAR2, 
              value IN VARCHAR2, 
              out_param OUT sys_refcursor) 
AS 
    TYPE t_array IS TABLE OF VARCHAR2(320); 
    v_array t_array:=t_array(); 
    -- identifers t_array; 
    column_name VARCHAR2(32); 
    info_qry VARCHAR2(500); 
    top_row_qry VARCHAR2(500); 
BEGIN 
--To define multiple values for a collection e.g. ABC, XYZ 
    v_array.EXTEND(2) ; 
    v_array(1):='ABC' ; 
    v_array(2):='XYZ' ; 
    --identifers := t_array('ABC') ; 
    column_name := get_column_name(TYPE) ; 

    info_qry := 'select INS.i_id, INS.model from table1 INS where INS.'||column_name||'='''||VALUE||''' order by INS.version desc'; 

    top_row_qry := 'select * from ('||info_qry||')' ; 

    OPEN out_param FOR top_row_qry ; 
EXCEPTION 
    WHEN OTHERS THEN 
    OPEN out_param FOR 'select null, null from dual' ; 
END get_something ; 
/

--To execute the procedure 
DECLARE 
    lv_type VARCHAR2(200); 
    lv_id NUMBER; 
    lv_cur SYS_REFCURSOR; 
BEGIN 
    get_something('param1','param2',lv_cur); 
    LOOP 
    FETCH lv_cur INTO lv_id,lv_type; 
    EXIT WHEN lv_cur%NOTFOUND; 
     --Do something..... 
    END LOOP; 
END;