正如我从您对@SuperMan 回答的评论中了解到的那样
是的,有没有办法将变量定义为('c','d','k')的占位符?
你想参数化IN
子句。
显然,您不能在这样定义的子句中传递:input
变量。我的意思是,从技术上讲你可以,但是查询不会产生所需的输出,因为它会搜索整个字符串。IN
exec :input := 'k,c,d'
'k,c,d'
您可以做的是,您可以'k,c,d'
用逗号分割(或任何其他)字符串并在IN
子句中使用结果。
这是一个例子:
-- variable of this type will contain letters produced by
-- splitting 'k,c,d' string
create or replace type T_vars as table of varchar2(5)
-- This table function returns collection of individual letters
create or replace function GetLetters(p_input in varchar2)
return t_vars
is
l_res T_Vars;
begin
select cast(
collect(
cast(res as varchar2(5))
) as T_Vars
)
into l_res
from ( select regexp_substr(p_input, '[^,]+', 1, level) as res
from dual
connect by level <= regexp_count(p_input, '[^,]+' )
);
return l_res;
end;
下面是它的工作原理:
SQL> variable x varchar2(11);
SQL> exec :x := 'k,c,d';
PL/SQL procedure successfully completed
SQL> select col
2 from table1
3 where col in (select column_value from table(getletters(:x)))
4 ;
结果:
COL
---
k
c
d