2016-09-17 2 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.

Мое требование - удалить rownum из top_row_qry, поэтому результат будет несколько строк.

Я хочу хранить каждое поле в некоторой переменной, из которой я буду использовать одну из переменных для некоторого сравнения в самой процедуре.

Так что в основном я хочу сохранить результаты, которые я могу позже перебрать и сравнить со списком значений.

Кроме того, мне нужно определить список значений в самой этой процедуре.

Что-то, как показано ниже:

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; 
Смежные вопросы