【问题标题】:oracle convert string parameter of stored procedure to number arrayoracle将存储过程的字符串参数转换为数字数组
【发布时间】:2020-01-28 03:31:25
【问题描述】:

我正在编写一个存储过程,它需要一个带有数字数组的 WHERE IN 子句。如何将这个数字数组传递给 SP。 我的想法是发送一个像'123,234,345'这样的字符串,然后在使用它之前在SP中解析它。这是一个好方法吗?如果是,我怎样才能使下面的代码工作?

CREATE OR REPLACE PROCEDURE sp_test2
(
    ids in varchar2, 
    cursor_ OUT SYS_REFCURSOR
)
AS
BEGIN
    OPEN cursor_ FOR

    SELECT *FROM my_table
    WHERE my_table.ID IN (
          SELECT regexp_substr(ids,'[^:]+', 1, level) AS list FROM dual
          CONNECT BY regexp_substr(ids, '[^:]+', 1, level) IS NOT NULL);
END;
/

例如(而不是转换代码)当这样使用时:IN(ids) 我得到 ORA-01722: 无效号码错误

【问题讨论】:

标签: oracle stored-procedures plsql


【解决方案1】:

我真的不想让事情复杂化

如果您可以简单地将一串以逗号分隔的数字作为参数传递并在之后将其拆分,那么您可以这样做:

SELECT *FROM my_table
WHERE my_table.ID IN (
      SELECT regexp_substr(ids,'[^,]+', 1, level) AS list FROM dual
      CONNECT BY regexp_substr(ids, '[^,]+', 1, level) IS NOT NULL);

不过,我不认为使用集合会使事情变得过于复杂。

【讨论】:

  • 如果我想在函数的帮助下调用这个转换,函数的返回类型是什么?使用示例可以是这样的: WHERE my_table.ID IN(my_parser(ids))
  • 这是一个嵌套表。你可以在这里找到更多信息:Nested Tables
【解决方案2】:

就像我建议的那样,这里是如何使用动态 SQL 来实现它。

create or replace procedure sp_test2(IDS in varchar2, CURSOR_ out SYS_REFCURSOR)
is
  L_SQL  varchar2(400);
begin
  L_SQL := 'select * from MY_TABLE where ID in (' || IDS || ')';
  open CURSOR_ for L_SQL;
end;

【讨论】:

    猜你喜欢
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2017-11-27
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多