在Oracle Procedure中将多个项目传递给IN子句

时间:2019-06-07 04:31:26

标签: oracle procedure

如何在过程中将多个项目传递给IN子句,例如EXEC TEST1('A','E')或EXEC TEST1('A','D','E')?项目数量不是预先确定的。

只有一项,程序TEST1可以如下。 并且EXEC TEST1('A')或TEST1('E')都可以正常工作。

 CREATE TABLE T1  (  
            C1 VARCHAR2,
            C2 VARCHAR2
     );

    INSERT INTO T1(C1)  VALUES ('A');
    INSERT INTO T1(C1)  VALUES ('B');
    INSERT INTO T1(C1)  VALUES ('C');
    INSERT INTO T1(C1)  VALUES ('D');
    INSERT INTO T1(C1)  VALUES ('E');

CREATE OR REPLACE PROCEDURE TEST1(p1 IN  VARCHAR2)
IS
BEGIN 
INSERT INTO T1(C2)
SELECT C1 FROM T1  WHERE C1 IN (p1);
END;
/

如何修改上面的代码以接受没有预定数量的多个输入项? 应该修改什么?

2 个答案:

答案 0 :(得分:1)

一个选项是创建一个自定义集合类型,并将其作为过程参数。在该过程内,使用TABLE函数取消对该集合的嵌套。

类型

create or replace type c1tab AS TABLE OF VARCHAR2(10);

程序

CREATE OR REPLACE PROCEDURE TEST1(p1 IN  c1tab)
IS
BEGIN 
 INSERT INTO T1(C2)
    SELECT C1 FROM T1  WHERE 
         C1 IN ( select column_value from  TABLE(p1)
         );
END;
/

执行

EXEC  TEST1( c1tab('A','D', 'E'));

DEMO

答案 1 :(得分:0)

另一种选择是将输入字符串分成几行,并在IN子句中使用它:

SQL> CREATE OR REPLACE PROCEDURE test1 (p1 IN VARCHAR2)
  2  IS
  3  BEGIN
  4     INSERT INTO t1 (c2)
  5        SELECT c1
  6          FROM t1
  7         WHERE c1 IN (    SELECT TRIM (REGEXP_SUBSTR (p1,
  8                                                      '[^,]+',
  9                                                      1,
 10                                                      LEVEL))
 11                            FROM DUAL
 12                      CONNECT BY LEVEL <= REGEXP_COUNT (p1, ',') + 1);
 13  END;
 14  /

Procedure created.

SQL>

测试:

SQL> SELECT * FROM t1;

C1         C2
---------- ----------
A
B
C
D
E

SQL> EXEC test1('A,D, E');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM t1;

C1         C2
---------- ----------
           A
           D
           E
A
B
C
D
E

8 rows selected.

SQL>