【问题标题】:oracle stored procedure error on large nvarchar2 value return大 nvarchar2 值返回时的 oracle 存储过程错误
【发布时间】:2018-02-26 16:14:55
【问题描述】:

我们编写了一个返回 nvarchar2 的 oracle 函数。当它返回像'hello'这样的小值时它工作正常。但是,当 nvarchar2 变长(大约 3000 个字符)时,它会返回“ORA-06502:字符串缓冲区太小”错误。函数返回值的大小有限制吗?

我们使用这样的函数:

SELECT sampleFunction('sampleArg') FROM DUAL;

【问题讨论】:

  • 存储函数结果的变量的大小是有限制的
  • 您是否考虑过更改函数,使其返回NCLOB?这可能会也可能不会满足您的需求 - 这取决于您如何使用函数值,例如您无法通过 NCLOB 进行分组或排序,但它实际上允许您无限长度。

标签: sql oracle stored-procedures nvarchar


【解决方案1】:

数据类型是in the documentation。对于NVARCHAR2,它说:

具有最大长度size 个字符的可变长度Unicode 字符串。您必须为NVARCHAR2 指定大小。 AL16UTF16 编码的字节数最多为 size 的两倍,UTF8 编码的字节数最多为 size 的三倍。最大size由国家字符集定义决定,上限为:

  • 如果MAX_STRING_SIZE = EXTENDED,则为32767字节

  • 如果MAX_STRING_SIZE = STANDARD,则为4000字节

有关MAX_STRING_SIZE 初始化参数的更多信息,请参阅扩展数据类型。

所以 3000 个 字符 不是限制;但是对于多字节字符,您将达到 4000 个字节。 (假设您使用的是标准字符串长度的 12cR2 或任何以前的版本)。

这是 SQL 上下文中的限制,这就是您显示的查询所具有的限制。

在 PL/SQL 上下文中things are slightly different。您定义的用于选择函数结果 into 的变量必须足够大,才能生成所生成的值,并且根据您的默认 length semantics,您为其提供的大小可能与您期望的不太一样。你可以更明确地指定,比如说,以下任何一个:

declare
  variable1 nvarchar2(4000 char);
  variable2 nvarchar2(4000 byte);
...

它们之间的真正区别在于,这两个变量中的任何一个都可以接受 4000 个单字节字符,但第一个也可以接受最多 4000 个多字节字符(最多 32767 个字节的硬限制),而第二个仍然会出错如果 bytes 的总数超过 4000,则少于 4000 个多字节字符。

您还需要在您的函数内部定义的任何变量都足够大以容纳您返回的值 - 包括任何多字节字符。

【讨论】:

    【解决方案2】:

    我通过将函数的返回类型从 NVARCHAR2 更改为 CLOB 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2019-06-03
      • 2014-05-15
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 2012-01-25
      • 1970-01-01
      相关资源
      最近更新 更多