2013-07-30 1 views
0

저는 PL/SQL을 처음 사용합니다 ... Varray에서 IN 매개 변수로부터 여러 값을 얻는 방법 ..... 다른 방법은 있습니까? 다른 옵션은 다음의 미세 .. 코딩 경우 값은 ... 어떻게 VARRAY의 값을 IN 매개 변수에서 얻을 수 있습니까?

나는 ... VARRAY를 통해 값을 interate 할 :

CREATE OR REPLACE 
PROCEDURE dynamic_query_build(
    vr_plan_sku_id IN VARCHAR2) 
IS 
type plan_sku_id_array IS VARRAY(999) OF VARCHAR2(5000); 
plan_sku_id plan_sku_id_array; 
total   INTEGER; 
vrx_plan_sku_id VARCHAR2(3000); 
BEGIN 
    vrx_plan_sku_id:= REPLACE(vr_plan_sku_id,',',chr(39)||','||chr(39)); 
    plan_sku_id := plan_sku_id_array(chr(39)||vrx_plan_sku_id||chr(39)); 
    total   := plan_sku_id.count; 
    FOR i   IN 1 .. total 
    LOOP 
    dbms_output.put_line(plan_sku_id(i)); 
    END LOOP; 
EXCEPTION 
WHEN OTHERS THEN 
    raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM); 
END dynamic_query_build; 

실행 :

set serveroutput on; 
declare 
vr_plan_sku_id varchar2(200) := '5863314,5863315'; 
BEGIN 
    dynamic_query_build(vr_plan_sku_id); 
END; 
/

내 출력 :

anonymous block completed 
'5863314','5863315' 

예상 출력 :

5863314 
5863315 

지금은 하나의 값으로 고려하고있다 ....

답변

0

프로 시저 dynamic_query_build를 사용하여 익명 블록을 만들었습니다. VARCHAR2 변수를 VARRAY로 분리하는 코드가 추가되었습니다. 질문에 대한 핵심은 다음과 같습니다. plan_sku_id.EXTEND(); varray를 동적으로 확장 할 수 있지만 정의 된 최대 값까지 도달 할 때까지만 유효합니다 (999). -

DECLARE 
vr_plan_sku_id varchar2(200) := '5863314,5863315'; 
PROCEDURE dynamic_query_build(
    vr_plan_sku_id IN VARCHAR2) 
IS 
type plan_sku_id_array IS VARRAY(999) OF VARCHAR2(5000); 
plan_sku_id plan_sku_id_array; 
total   INTEGER; 

position PLS_INTEGER := 0; 
last_position PLS_INTEGER := 1; 
tmp VARCHAR2(5000); 
counter PLS_INTEGER := 1; 
BEGIN 
    plan_sku_id := plan_sku_id_array(); 
    LOOP 
    position := INSTR(vr_plan_sku_id, ',', last_position); 
    IF position > 0 THEN 
     tmp := SUBSTR(vr_plan_sku_id, last_position, position - last_position); 
     last_position := position + 1; 
    ELSE 
     tmp := SUBSTR(vr_plan_sku_id, last_position); 
    END IF; 
    plan_sku_id.EXTEND(); 
    plan_sku_id(counter) := tmp; 
    counter := counter + 1; 
    EXIT WHEN position = 0 OR counter > 10; 
    END LOOP; 
    total   := plan_sku_id.count; 
    FOR i   IN 1 .. total 
    LOOP 
    dbms_output.put_line(plan_sku_id(i)); 
    END LOOP; 
EXCEPTION 
WHEN OTHERS THEN 
    raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM); 
END dynamic_query_build; 
BEGIN 
    dynamic_query_build(vr_plan_sku_id); 
END; 
/
+0

고마워요 !! 찌르다에 문제가없는 그 일. – spyga

0

이 문자열에서 따옴표를 제거합니다 DBMS_OUTPUT 문에 교체를 넣어

 .... 
    dbms_output.put_line replace (replace (plan_sku_id(i), ''''))',',chr(10); 
    ..... 
+0

는 Harshit 안녕하세요 값 아래 .. plan_sku_id 같은 배열에 사용할 = plan_sku_id_array (vr_plan_sku_id); 그리고 Varray에서 값을 반복하고 싶습니다 – spyga

+0

@ user2582602 위의 수정 작업을 수행하는 값을 출력하고 있습니다. – Harshit

+0

내가이 작업을 시도 했으므로이 시나리오를 시도했습니다 ... VARRAY에 대한 입력을 제공 할 수 있습니까? 실행 시간에? – spyga