Вызов хранимой процедуры с оператором IS IN в Oracle - PullRequest
1 голос
/ 30 марта 2012

У меня следующая проблема.Мне нужно отфильтровать извлечение данных в хранимой процедуре:

SELECT * FROM tab WHERE post_code IS IN ('pc1', 'pc2', 'pc3');

Мой вопрос: как передать аргументы pc1, pc2, pc3 ... в хранимую процедуру?Как массив или как строка?Когда я пытаюсь передать как строку, у меня проблемы с апострофами.Передача массива, на мой взгляд, не очень хороша из-за производительности ... Мне нужно создать цикл for и создать строку, которая будет передаваться так:

SELECT * FROM tab WHERE post_code IS IN (post_codes);

Как это сделать правильно?

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

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

Это будет работать:

declare
    post_codes sys.dbms_debug_vc2coll := new sys.dbms_debug_vc2coll ('pc1', 'pc2', 'pc3');
    lrec tab%rowtype;
begin
    select * into lrec
    where post_code in ( select * from table(post_codes));
end;
/

Это только подтверждение концепции. Он выдаст исключение TOO_MANY_ROWS, если запрос вернет более одной строки. Поскольку вы не предоставили никакого контекста для того, что вы пытаетесь достичь, я не удосужился изобрести что-либо exra.

0 голосов
/ 30 марта 2012

На мой взгляд, проще всего использовать SQL, чтобы разбить вашу строку:

with id_generator
    as
    (
      SELECT regexp_substr(:txt, '[^,]+', 1, LEVEL) token
      FROM dual
      CONNECT BY LEVEL <= length(:txt) - length(REPLACE(:txt, ',', '')) + 1
    )
    select u.id, u.username
    from users u, id_generator g
    where u.id = g.token;

Этот запрос выглядит немного страшно, но вы можете взять верхнюю часть и запустить его изолированно, чтобы посмотреть, что он делает:

SELECT regexp_substr(:txt, '[^,]+', 1, LEVEL) token
FROM dual
CONNECT BY LEVEL <= length(:txt) - length(REPLACE(:txt, ',', '')) + 1

Это создает строку для каждого элемента в вашем списке, разделенном запятыми, который затем можно присоединить к другой таблице, чтобы получить результаты.

Больше обсуждений по этой проблеме в моем блоге - http://betteratoracle.com/posts/20-how-do-i-bind-a-variable-in-list

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