2016-09-17 331 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;