В соответствии с ответом @ Marcin, вы не можете сделать это, однако, есть немало, чтобы добавить к этому, поскольку ваш запрос должен действительно работать, т.е. запускаться.
Проще говоря, вы не можете использовать привязкупеременная для таблицы или столбца.Кроме того, для связывания переменных они должны быть символами, поэтому, если вы хотите получить число, вы должны использовать to_number(:b1)
и т. Д.
. Здесь ваш запрос падает.Когда вы передаете строку, Oracle предполагает, что весь ваш список представляет собой одну строку.Таким образом, вы эффективно работаете:
select field1
from table1
where field2 = v_list
Нет никаких причин, почему вы не можете сделать это по-другому.Я предполагаю, что вы динамически создаете v_list
, что означает, что все, что вам нужно сделать, это создать этот список по-другому.Ряд условий or
, якобы :-), ничем не отличается от использования in
.
Якобы, я имею в виду, никогда не полагайтесь на то, что не проверено.Хотя Том говорит в ссылке, что могут быть ограничения производительности, нет гарантии, что это не было быстрее, чем сначала использовать in
.Лучше всего выполнить трассировку вашего запроса и его запроса и посмотреть, какая разница, если есть.
SQL> set serveroutput on
SQL>
SQL> declare
2
3 l_string varchar2(32767);
4 l_count number;
5
6 begin
7
8 for xx in ( select rownum as rnum, a.*
9 from user_tables a
10 where rownum < 20 ) loop
11
12 if xx.rnum = 1 then
13 l_string := 'table_name = ''' || xx.table_name || '''';
14 else
15 l_string := l_string || ' or table_name = ''' || xx.table_name || '
''';
16 end if;
17
18 end loop;
19
20 execute immediate 'select count(*)
21 from user_tables
22 where ' || l_string
23 into l_count
24 ;
25
26 dbms_output.put_line('count is ' || l_count);
27
28 end;
29 /
count is 19
PL/SQL procedure successfully completed.