2016-12-08 53 views
1

以下是我創建的函數,用於接受varchar2項的數組並返回該記錄的內部pk,該記錄是NUMBER記錄。我正在努力獲得將VARCHAR_ARRAY類型的數組傳遞給遊標中的簡單sql查詢的語法,並返回類型爲NUMBER_ARRAY的變量。錯誤在第8,42行,即FROM table_name WHERE column_name IN VARCHAR_ARRAY被傳遞給該函數。請幫助我解決這個錯誤,因爲我正在學習plsql。PL/SQL:ORA-00932:不一致的數據類型:期望的NUMBER得到USER_NAME.VARCHAR_ARRAY

create or replace TYPE VARCHAR_ARRAY AS VARRAY(1000000) OF VARCHAR2(1000); 
/

    create or replace TYPE NUMBER_ARRAY AS VARRAY(1000000) OF NUMBER; 
/

    create or replace Function GET_PRODUCT_ID_ARR(V_PRODUCT_NUM_ARR IN VARCHAR_ARRAY) 
    RETURN NUMBER_ARRAY 
    IS 
    product_id_list number_array := number_array(); 
    CURSOR c1 
    IS 
    SELECT cat_map_id 
    FROM mn_cat_map WHERE product_num IN (V_PRODUCT_NUM_ARR) and catalog_type = 'INT'; 
    v_output NUMBER; 
    BEGIN 
     OPEN c1; 
     LOOP 
      fetch c1 into product_id_list; 
      EXIT WHEN c1%notfound; 
      product_id_list.extend; 
      product_id_list(product_id_list.count) := v_output; 
     dbms_output.put_line('Product ('||v_output ||'):'||product_id_list(v_output)); 
     END LOOP; 
    Close c1; 
    RETURN product_id_list; 
    END; 
/
+0

我是有點'VARRAY(1000000)不解.. .'。 1000000限制背後的可能商業邏輯是什麼? –

回答

1

有兩個問題:

  1. 你要投varray表:

    CURSOR c1 
    IS 
    SELECT cat_map_id 
    FROM mn_cat_map 
    WHERE product_num IN (select column_value from table(V_PRODUCT_NUM_ARR)) 
        and catalog_type = 'INT'; 
    
  2. 添加bulk collectfetch

    LOOP 
        fetch c1 bulk collect into product_id_list limit 100; 
        EXIT WHEN c1%notfound; 
        product_id_list.extend; 
        product_id_list(product_id_list.count) := v_output; 
        dbms_output.put_line('Product ('||v_output ||'):'||product_id_list(v_output)); 
        END LOOP; 
    

如果您編寫limit 100,則每個循環將在product_id_list中放置100條記錄。您可以省略limit子句,在這種情況下,您將在一次獲取中獲取所有記錄。

編輯
如何看到的結果:

declare 
    myarray varchar_array; 
    my_num_array number_array; 
begin 
    myarray := varchar_array(); 
    myarray.extend(2); 
    myarray(1) := '151043'; 
    myarray(2) := '2895'; 
    my_num_array := GET_PRODUCT_ID_ARR(myarray); 
    for i in 1 .. my_num_array.count loop 
    dbms_output.put_line(my_num_array(i)); 
    end loop; 
end; 
/
+0

當我執行此如下聲明 myarray varchar_array; begin myarray:= varchar_array(); myarray.extend(2); myarray(1):='151043'; myarray(2):='2895'; dbms_output.put_line(GET_PRODUCT_ID_ARR(myarray)); 結束; / ORA-06550:8號線,4列: PLS-00306:語句被忽略 06550. 00000 - 「行%S,列%:在調用 'PUT_LINE' PL/SQL錯誤的數量或類型的參數s:\ n%s「 *原因:通常是PL/SQL編譯錯誤。 *操作: –

+0

@SanjayRao這是因爲你的函數'GET_PRODUCT_ID_ARR'返回一個數組。 'DBMS_OUTPUT.PUT_LINE'不能採用數組可變,它需要一個字符串。 – Dmitry

+0

@SanjayRao我在答案中添加了示例。 – Dmitry

1

什麼@William說是安靜真的。不建議使用VARRAY(1000000)。您可以創建一個類型table。但是,如果我遵循你所做的,你的代碼中就會出現一些錯誤。請看下面你如何做到這一點。

表準備:

create table mn_cat_map(cat_map_id number, 
         product_num varchar2(1000), 
         catalog_type varchar2(10)); 
/
INSERT INTO T541682.MN_CAT_MAP (CAT_MAP_ID, PRODUCT_NUM, CATALOG_TYPE) 
    VALUES (10, 'A123', 'INT'); 

INSERT INTO T541682.MN_CAT_MAP (CAT_MAP_ID, PRODUCT_NUM, CATALOG_TYPE) 
    VALUES (2, 'B121', '2Wheer'); 

INSERT INTO T541682.MN_CAT_MAP (CAT_MAP_ID, PRODUCT_NUM, CATALOG_TYPE) 
    VALUES (3, 'C645', '4Wheer'); 

COMMIT; 

create or replace TYPE VARCHAR_ARRAY AS VARRAY(1000000) OF VARCHAR2(1000); 
/
create or replace TYPE NUMBER_ARRAY AS VARRAY(1000000) OF NUMBER; 
/

碼:看explainatory評論直列

CREATE OR REPLACE FUNCTION GET_PRODUCT_ID_ARR (V_PRODUCT_NUM_ARR VARCHAR_ARRAY) 
    RETURN NUMBER_ARRAY 
IS 
    product_id_list number_array := number_array(); 

    CURSOR c1(tbl_list VARCHAR_ARRAY) 
    IS 
     SELECT cat_map_id 
     FROM mn_cat_map 
     WHERE product_num in (select column_value from table(tbl_list)) ---Checking if the item exists in the table with passed collection 
     AND catalog_type = 'INT'; 

    v_output  NUMBER:= 0; 
BEGIN 

    --not opening cursor and am not looking for processing any records. 
    --OPEN c1(V_PRODUCT_NUM_ARR); 

    --passing the input varray to the cursor. 
    for i in c1(V_PRODUCT_NUM_ARR) 
    loop 

    v_output:=v_output + 1; 

    product_id_list.extend; 

    product_id_list(product_id_list.COUNT):= i.cat_map_id; 

    DBMS_OUTPUT.put_line('Product (' || v_output || '):' ||product_id_list(product_id_list.COUNT)); 


    end loop; 

    RETURN product_id_list; 
END; 
/

執行:

SQL> select GET_PRODUCT_ID_ARR(VARCHAR_ARRAY('A123','B121','C645')) COl1 from dual; 

COL1 
-------------------------------------------------------------------------------- 
NUMBER_ARRAY(10) 

Product (1):10 
+0

謝謝Xing,For循環更容易理解。 –

相關問題