2013-07-30 90 views
0

我是新來的PL/SQL ...在Varray我怎麼能從IN參數獲得多個值..... else有沒有另外的方法來獲得值...我們怎樣才能得到VARRAY從IN參數的過程

我想interate通過VARRAY值...如果任何其他選項,然後它很好.. 編碼:

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