2015-06-26 190 views
2

我需要您的幫助.....我如何將多個值傳遞給函數中的單個參數?如何將多個值傳遞給數組參數函數

值'AAA 1','BBB 2','CCC 3''DDD 4'將被傳遞給相同的參數「v_type」,這些值將基於從下拉菜單前端屏幕。用戶可以從列表中選擇一個或多個值,並將這些值傳遞給過程,然後將過程傳遞給過程中SELECT語句的WHERE子句。

我的功能somenthing這樣的:

CREATE OR REPLACE FUNCTION FN_GET_ROWS 
(v_date_ini   IN DATE, 
    v_date_end   IN DATE, 
    v_type    IN VARCHAR2 
) 
RETURN TEST_TABTYPE 
AS 
V_Test_Tabtype Test_TabType; 
BEGIN 
    SELECT TEST_OBJ_TYPE(DATE, NAME, ALERT) 
      BULK COLLECT INTO V_Test_TabType 
      FROM (select date, name, alert 
       from Table 
      where DATE BETWEEN v_date_ini AND v_date_end 
       AND Alert in (select REGEXP_SUBSTR (v_type, '[^,]+', 1, level) 
             from dual 
            connect by level <= length(regexp_replace(v_type,'[^,]*'))+1) 
); 
RETURN V_Test_TabType; 
END; 

搜索互聯網,我發現,也許一個VARRAY工作,但我不知道如何給它賦值給變量:類型與參數的用戶在屏幕上選擇。

我在數據庫上創建這種類型,我該如何使用它?我是一個新的plsql。

CREATE TYPE alert_obj AS OBJECT (type_alert VARCHAR2(60)); 
CREATE TYPE alert_varray_typ AS VARRAY(100) OF alert_obj; 

感謝您的幫助

伊曼紐爾。

+0

這些值將從哪裏傳遞 - 什麼是前端?你從哪種語言調用Oracle函數? (並且你也要返回一個集合?也許你想要一個ref cursor?) –

+0

嗨Alex,前端是BI發佈者11,數據集的查詢是: SELECT * FROM TABLE(FN_GET_ROWS(:date_ini,: date_end,:type)); 問題是,當BI Publisher通過參數時,似乎是這樣:鍵入它將每個逗號解釋爲單獨的參數,因此我得到的參數數量無效錯誤。 如果選擇的值不是錯誤,然後選擇兩個錯誤值:ORA-06553:PLS-306:調用'FN_GET_ROWS'時參數的數量或類型錯誤 –

回答

0

我不知道,如果我真的明白你的問題。但我認爲,還有更多解決方案。

可以使用VARCHAR2的字符串作爲參數,之後用這樣的函數解析它:

PROCEDURE p_parse_into_array (
    lv_str   IN   VARCHAR2, 
    lt_table  IN OUT  sys.dbms_debug_vc2coll, 
    lv_splitter IN   VARCHAR2) 
IS 
    ln_position NUMBER := 0; 
    ln_position_2 NUMBER; 
    ln_i   NUMBER := 1; 
BEGIN 
    ln_position_2 := INSTR(lv_str,lv_splitter,1,1); 

    WHILE ln_position_2 != 0 
    LOOP 
    lt_table.extend(1); 
    lt_table(ln_i) := SUBSTR(lv_str,ln_position+1,ln_position_2-ln_position-1); 
    ln_position := INSTR(lv_str,lv_splitter,1,ln_i); 
    ln_position_2 := INSTR(lv_str,lv_splitter,1,ln_i+1); 
    ln_i := ln_i + 1; 
    END LOOP; 
END; 

其中lv_str是字符串進行解析時,lt_table爲varchar(2000)和lv_splitter的表是性格分裂(,。; - 等),這個函數返回值爲lt_table,你可以在你選擇的菜單中使用它。

第二種解決方案是像你說的使用VARRAY,但你需要使用動態SQL命令有:

execute immediate 'select * from dual where some_value in (select * from table('||my_varray_table||')); 

與其他解決方案是使用嵌套表。這是你的選擇,你喜歡哪種解決方案:)

相關問題