Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中使用“IS IN”语句调用存储过程_Sql_Oracle_Stored Procedures - Fatal编程技术网

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,我看不到您的查询中有任何函数调用。易用性取决于上下文。起点是字符串吗?或者起点是一组离散值,这些离散值随后被连接在一起,以试图将它们传递给查询?