2015-06-26 139 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||')); 

与其他解决方案是使用嵌套表。这是你的选择,你喜欢哪种解决方案:)

相关问题