Oracle相当于Java的Varargs

时间:2013-05-14 08:41:24

标签: oracle plsql sqldatatypes

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

public void foo(String... bar) {
}

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

请告诉我,关联阵列是否正确?

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

谢谢

2 个答案:

答案 0 :(得分:10)

您至少有3个选项:

  1. (标准)使用关联数组作为过程参数
  2. 定义'足够'数量的可选形式参数
  3. 使用带有已定义分隔符char的单个varchar参数
  4. 示例代码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'));