【问题标题】:How to pass bulk comma separated values as a parameter to Oracle stored procedure?如何将批量逗号分隔值作为参数传递给 Oracle 存储过程?
【发布时间】:2020-09-28 20:14:08
【问题描述】:

我想将大约 2000 个逗号分隔值传递给 oracle 存储过程。我的程序看起来像这样

CREATE OR REPLACE PROCEDURE SET_VALUES(V_VALUES IN VARCHAR2)

现在变量 V_VALUES 是一个由 2000 个逗号分隔的值组成的字符串。传递该参数的最有效方法是什么?由于某些原因,此处无法创建新表。

【问题讨论】:

  • 什么是数据库字符集?什么是 4 位 Oracle 版本?值的平均大小是多少?
  • 你的意思是你想从一个字符串中创建 2000 个单独的行?请显示字符串、表定义和预期结果的示例
  • @pifor 版本是 12c r2。该值的平均大小约为 10 个字符。
  • @OldProgrammer 我不会创建单独的行,但是传递这个更大的字符串参数有时会破坏进一步的代码。除了字符串参数,还有其他方法吗?

标签: oracle csv stored-procedures oracle-sqldeveloper


【解决方案1】:

“最有效的方法”取决于谁在问

在我看来,这正是您所说的:作为逗号分隔值字符串。

  • 如果您从 PL/SQL 传递它,它的长度可以达到 32K,因为它是 PL/SQL 中 varchar2 字符串的最大长度
  • 如果您从 SQL 传递它,则限制为 4K,因为它是 SQL 中 varchar2 字符串的最大长度
    • 这意味着您可以传递大约 2000 个单个字母或数字,但仅此而已,因为“字母 + 逗号”使 2 个字符乘以 2000 得到 4K

下一个观点说:你打算用这样的字符串做什么?用它做任何事情都是无效的。就好像您计划在存储过程的查询中使用它一样,在其WHERE 子句中使用IN。可悲的是,它不会像那样工作 - 你必须将它分成几行。有技术所以没问题;只是说。

因此,我宁愿将这 2000 个值存储到一个表中,并以最方便的方式在过程中使用它 - 将其连接到其他表。

正如我所说,它取决于


或者,如果您不限于将varchar2 数据类型作为输入参数,请尝试使用CLOB

SQL> create or replace procedure p_test (par_c in clob) as
  2  begin
  3    null;
  4  end;
  5  /

Procedure created.

SQL>

【讨论】:

  • 分割等事情就搞定了。这里的问题实际上是无法容纳这么多数据的数据类型。您的答案是绝对正确的,但遗憾的是创建另一个表是无法选择的,因为它不适合设计。这就是我寻找其他选择的原因。
  • 那你能传一个 CLOB 吗?
  • 是的,我们可以试试。 oracle存储过程允许CLOB作为输入参数吗?
  • 是的,确实如此。请参阅我在上面发布的示例。
  • 在尝试执行该过程时,我收到了带有 clob 的“PLS-00172: string literal too long”错误。
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
相关资源
最近更新 更多