Sql 在Oracle中使用“IS IN”语句调用存储过程
我有以下问题。我需要过滤存储过程中的提取数据:Sql 在Oracle中使用“IS IN”语句调用存储过程,sql,oracle,stored-procedures,Sql,Oracle,Stored Procedures,我有以下问题。我需要过滤存储过程中的提取数据: SELECT * FROM tab WHERE post_code IS IN ('pc1', 'pc2', 'pc3'); 我的问题是:如何传递参数pc1、pc2、pc3。。。进入存储过程? 作为数组还是作为字符串? 当我尝试以字符串形式传递时,我遇到了撇号的问题。 在我看来,由于性能原因,传递数组并不好……我需要创建for循环并创建字符串,该字符串将按如下方式传递: SELECT * FROM tab WHERE post_code IS I
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);
如何正确操作?不确定为什么您认为传递数组会导致性能问题 这将有助于:
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;
/
这只是概念证明。如果查询返回多行,它将抛出太多行异常。由于您没有为您想要实现的目标提供任何上下文,因此我没有费心发明任何exra。我认为最简单的方法是使用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
这将为逗号分隔列表中的每个项目生成一行,然后您可以将其连接到另一个表以获得结果
关于这个问题的更多讨论,请访问我的博客-:首先,IS IN的语法不正确,请仅使用IN,我看不到您的查询中有任何函数调用。易用性取决于上下文。起点是字符串吗?或者起点是一组离散值,这些离散值随后被连接在一起,以试图将它们传递给查询?