我需要你的帮助.....我怎样才能将多个值传递给函数中的单个参数?
值' 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;
感谢您的帮助
以马内利。
答案 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||'));
其他解决方案是使用嵌套表。这是您的选择,您喜欢哪种解决方案:)