如何将多个值传递给数组参数函数

时间:2015-06-26 18:01:39

标签: function plsql oracle11g varray

我需要你的帮助.....我怎样才能将多个值传递给函数中的单个参数?

值' AAA 1',' BBB 2',' CCC 3' ' DDD 4'要传递给相同的参数" v_type",将根据前端屏幕下拉列表中的选择发送值。用户可以从列表中选择一个或多个值,这些值应该传递给过程,过程又将传递给过程内SELECT语句的WHERE子句。

我的功能就像这样:

实施例

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;

感谢您的帮助

以马内利。

1 个答案:

答案 0 :(得分: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是要拆分的字符(,。; - etc),此函数将值返回到lt_table,您可以在选择菜单中使用。

第二个解决方案是使用varray,但是你需要在命令中使用动态sql:

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

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