我正在尝试创建一个PL / SQL过程,它可以处理一个未知但数量相对较少的Strings / Varchar2作为参数。 Java中的等价物可能是使用Varargs:
public void foo(String... bar) {
}
看看Oracle的documentation on Collections and Records,似乎使用关联数组是一个合适的选择,但我不确定。
请告诉我,关联阵列是否正确?
如果在调用过程调用时可以传入匿名关联数组?
谢谢
答案 0 :(得分:10)
您至少有3个选项:
示例代码1。)
TYPE t_map IS TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(20);
CREATE OR REPLACE PROCEDURE demo_1 ( vararg IN t_map ) IS
BEGIN
/* whatever */
NULL;
END demo_1;
/* ... somewhere else ... */
my_var t_map;
my_var('first') := 'this';
my_var('next') := ' is a ';
my_var('last') := 'demo';
demo_1 ( my_var );
/* ... */
示例代码2.)(最多5个参数)
CREATE OR REPLACE PROCEDURE demo_2 (
vararg1 IN VARCHAR2 DEFAULT NULL
, vararg2 IN VARCHAR2 DEFAULT NULL
, vararg3 IN VARCHAR2 DEFAULT NULL
, vararg4 IN VARCHAR2 DEFAULT NULL
, vararg5 IN VARCHAR2 DEFAULT NULL
) IS
BEGIN
/* whatever */
NULL;
END demo_2;
/* ... somewhere else ... */
demo_2 ( 'this', ' is a ', 'demo' );
/* ... */
示例代码3.)(特殊字符为';' - 不得出现在有效负载数据中)
CREATE OR REPLACE PROCEDURE demo_3 (
vararg IN VARCHAR2
) IS
l_arg2 VARCHAR2(50);
l_arg5 VARCHAR2(50);
BEGIN
l_arg2 := SUBSTR(REGEXP_SUBSTR(vararg, ';[^;]*', 1, 2), 2);
l_arg5 := SUBSTR(REGEXP_SUBSTR(vararg, ';[^;]*', 1, 5), 2);
/* whatever */
END demo_3;
/* ... somewhere else ... */
demo_3 ( ';this; is a ;demo;;really!;' );
/* ... */
答案 1 :(得分:4)
create or replace type strings_type as table of varchar2(50);
select * from table (strings_type ('DD','CC','EE'));