2016-09-17 7 views
0

내 질문은 꽤 기본이지만 저장 프로 시저에 대한 완전한 초보자이며 빨리 돌아갈 필요가 있습니다. 어떤 도움 지금, 아래 오라클 저장 프로 시저

은 우리가 가지고있는 현재 저장 프로 시저입니다

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; 

을 이해할 수있을 것이다 I이 절차를 실행하면, 그것은 때문에 ROWNUM 상태로 나에게 하나 개의 레코드를 제공합니다.

내 요구 사항은 top_row_qry에서 ROWNUM을 제거하므로 여러 행이 될 것입니다 결과입니다.

나는 어느 내가 절차 자체에 약간의 비교를 위해 변수 중 하나를 사용에서 어떤 변수로 각 필드를 저장할.

그래서 기본적으로 내가 이상 나중에 반복하는 내가 할 수있는 결과를 저장하고 값 목록과 비교합니다.

또한,이 절차 자체에 값 목록을 정의해야합니다. 다음과 같은

뭔가 :

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

이 사람이 나를 도울 수있다.

+2

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

+0

예 - 솔루션은 하나 개 이상의 행이 PL/SQL – Pat

+1

에서 조작 할 때 커서를 사용하는 것입니다 컬렉션에 '대량 수집'사용 –

답변

0

나는 당신이 당신의 절차를 OUT 매개 변수로 커서를 사용하고 나중에 귀하의 요구 사항을 위해 그것을 사용할 필요 같아요.

은 또한에 대해 "내가이 절차 자체.에 값 목록을 정의 할 필요가있다" 당신은 수집에게 나는 프로 시저 코드 (v_array)에서 사용한 방법을 사용할 수 있습니다. 그런 다음 루프를 사용하여 v_array의 여러 값을 탐색 할 수 있습니다. OldProgrammer에서 언급 한 바와 같이

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;