Передача нескольких пунктов в предложение IN в процедуре Oracle - PullRequest
1 голос
/ 07 июня 2019

Как передать несколько элементов в предложение 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 ]

1 голос
/ 07 июня 2019

Один из вариантов - создать собственный тип коллекции и указать его в качестве аргумента процедуры. Внутри процедуры используйте функцию 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

0 голосов
/ 07 июня 2019

Другой вариант - разбить входную строку на строки и использовать ее в предложении 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>
...