Oracle 等效于 Java 的 Varargs

Posted

技术标签:

【中文标题】Oracle 等效于 Java 的 Varargs【英文标题】:Oracle equivalent of Java's Varargs 【发布时间】:2013-05-08 11:09:25 【问题描述】:

我正在尝试创建一个 PL/SQL 过程,它可以处理未知但相对较少的字符串/Varchar2 数量作为参数。 Java 中的等价物可能是使用 Varargs:

public void foo(String... bar) 

查看 Oracle 的 documentation on Collections and Records 似乎使用关联数组是一个合适的选择,但我不确定。

你能告诉我关联数组是否是正确的方法吗?

是否可以在调用过程时传入匿名关联数组?

谢谢

【问题讨论】:

orafaq.com/usenet/comp.databases.oracle.misc/2007/02/24/… 这对我有用:dba.stackexchange.com/a/137256 【参考方案1】:
create or replace type strings_type as table of varchar2(50);
select * from table (strings_type ('DD','CC','EE'));

【讨论】:

需要注意的是,这只有在 strings_type 是在全局范围内创建时才有效。如果您在块中声明类型(也可能在包主体中)并尝试在其上使用table(),它将不起作用。【参考方案2】:

您至少有 3 个选项:

    (标准)使用关联数组作为过程参数 定义“足够”数量的可选形式参数 使用带有已定义分隔符字符的单个 varchar 参数

示例代码 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!;' );
/* ... */

【讨论】:

以上是关于Oracle 等效于 Java 的 Varargs的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 等效于 C# HMACSHA256

Oracle PL 等效于 foreach 循环

Oracle 等效于 information_schema.tables

Oracle 12c 等效于 C# Encoding.ASCII.GetBytes

适用于 Oracle 数据库的 SSDT 等效项

将嵌入式 Oracle JVM 中运行的 Java 按名称授予 Oracle 目录的等效语法是啥?