如何在过程中将多个项目传递给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;
/
如何修改上面的代码以接受没有预定数量的多个输入项? 应该修改什么?
答案 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'));
答案 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>