Oracle PL / SQL - получить список значений в качестве параметра IN, использовать их в предложении WHERE и вернуть результаты в процедуре. - PullRequest
0 голосов
/ 06 февраля 2020

Мне нужно создать процедуру Oracle, которая получает список значений, скажем, идентификаторы клиентов, и использует эти идентификаторы в предложении WHERE оператора SELECT, ища все эти идентификаторы клиентов в таблице. Полученные столбцы и строки этой таблицы должны быть возвращены вызывающей процедурой. Количество идентификаторов клиентов является переменным.

Я полагаю, что для этого я должен использовать курсоры, и процедура будет объявлена ​​аналогично этому: CREATE PROCEDURE (c_customers IN SYS_REFCURSOR, c_results OUT sys_refcursor) IS BEGIN ..., но я не знаю, как манипулировать этими курсорами.

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Я думаю, вам нужно принять идентификаторы клиентов в качестве ввода строки.

посмотреть, может ли помочь следующее:

CREATE PROCEDURE YOUR_PROC_NAME (
    C_CUSTOMERS   IN            VARCHAR2,
    C_RESULTS     OUT           SYS_REFCURSOR
) IS
BEGIN
    OPEN C_RESULTS FOR 
    SELECT *
      FROM YOUR_TABLE
     WHERE YOUR_COLUMN IN (
              SELECT REGEXP_SUBSTR(C_CUSTOMERS, '[^,]+', 1, LEVEL)
                FROM DUAL
          CONNECT BY REGEXP_SUBSTR('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, LEVEL) IS NOT NULL
       );

END;

Cheers !!

0 голосов
/ 06 февраля 2020

альтернативным решением является использование коллекций:

Сначала вы должны создать глобальную коллекцию как тип

CREATE OR REPLACE TYPE tab_number is TABLE OF NUMBER;

, а затем использовать ее как тип аргументов в Ваша процедура

CREATE PROCEDURE YOUR_PROC_NAME (
    in_id_list IN            tab_number ,
    C_RESULTS     OUT           SYS_REFCURSOR
) IS
BEGIN
    OPEN C_RESULTS FOR 
    SELECT *
      FROM YOUR_TABLE
     WHERE YOUR_COLUMN IN (
              SELECT column_value from table(in_id_list)
       );

END;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...