大 nvarchar2 值的 oracle 存储过程错误 return

oracle stored procedure error on large nvarchar2 value return

我们编写了一个 returns nvarchar2 的 oracle 函数。当它 return 像 'hello' 这样的小值时它工作正常。但是,当 nvarchar2 变长(大约 3000 个字符)时,它会 return "ORA-06502 : character string buffer too small" 错误。函数的 return 值的大小是否有限制?

我们这样使用函数:

SELECT sampleFunction('sampleArg') FROM DUAL;

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

Variable-length Unicode character string having maximum length size characters. You must specify size for NVARCHAR2. The number of bytes can be up to two times size for AL16UTF16 encoding and three times size for UTF8 encoding. Maximum size is determined by the national character set definition, with an upper limit of:

  • 32767 bytes if MAX_STRING_SIZE = EXTENDED

  • 4000 bytes if MAX_STRING_SIZE = STANDARD

Refer to Extended Data Types for more information on the MAX_STRING_SIZE initialization parameter.

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

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

在 PL/SQL 上下文中 things are slightly different. The variable you define to select the function result into has to be big enough for the value being generated, and the sizing you give it may not be quite what you expect depending on your default length semantics。您可以使用以下任一方法更明确地指定:

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

它们之间的区别实际上是这些变量中的任何一个都可以接受 4000 single-byte 个字符,但第一个也可以接受最多 4000 个多字节字符(最多 32767 字节的硬限制),而如果 bytes 的总数超过 4000.

,second 仍然会出错,少于 4000 个多字节字符

您还需要在您的函数中定义的任何变量都足够大以保存您返回的值——包括任何多字节字符。

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