oracle преобразовать строковый параметр хранимой процедуры в числовой массив - PullRequest
0 голосов
/ 27 января 2020

Я пишу хранимую процедуру, которая нуждается в предложении WHERE IN с массивом чисел. Как я могу передать этот массив чисел в SP. Я подумал, что посылаю строку типа «123,234,345», а затем анализирую ее в SP перед использованием. Это хороший способ сделать это? Если да, то как я могу заставить работать приведенный ниже код?

CREATE OR REPLACE PROCEDURE sp_test2
(
    ids in varchar2, 
    cursor_ OUT SYS_REFCURSOR
)
AS
BEGIN
    OPEN cursor_ FOR

    SELECT *FROM my_table
    WHERE my_table.ID IN (
          SELECT regexp_substr(ids,'[^:]+', 1, level) AS list FROM dual
          CONNECT BY regexp_substr(ids, '[^:]+', 1, level) IS NOT NULL);
END;
/

Например (вместо кода преобразования) при использовании так: IN (ids) я получаю ORA-01722: ошибка неверного номера

Ответы [ 2 ]

1 голос
/ 27 января 2020

Я действительно не хочу усложнять вещи

Если это нормально, просто передать строку чисел, разделенных запятыми, в качестве параметра и затем разделить ее, тогда вы можете сделайте это так:

SELECT *FROM my_table
WHERE my_table.ID IN (
      SELECT regexp_substr(ids,'[^,]+', 1, level) AS list FROM dual
      CONNECT BY regexp_substr(ids, '[^,]+', 1, level) IS NOT NULL);

Однако я не думаю, что использование коллекции слишком усложняет вещи.

0 голосов
/ 27 января 2020

Как я и предлагал, вот как это сделать, используя Dynami c SQL.

create or replace procedure sp_test2(IDS in varchar2, CURSOR_ out SYS_REFCURSOR)
is
  L_SQL  varchar2(400);
begin
  L_SQL := 'select * from MY_TABLE where ID in (' || IDS || ')';
  open CURSOR_ for L_SQL;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...