2

我需要你的帮助.....如何将多个值传递给函数中的单个参数?

'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 可能有效,但我不知道如何将其分配给变量:type 以及用户在屏幕上选择的参数。

我在数据库上创建了这种类型,我该如何使用它?我是 plsql 的新手。

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

谢谢你的帮助

伊曼纽尔。

4

1 回答 1

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||'));

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

于 2015-07-08T12:56:45.083 回答