大型nvarchar2值返回时的oracle存储过程错误

问题描述 投票:0回答:2

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

我们使用这样的函数:

SELECT sampleFunction('sampleArg') FROM DUAL;
sql oracle stored-procedures nvarchar
2个回答
1
投票

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

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

  • 如果MAX_STRING_SIZE = EXTENDED 32767字节
  • 如果MAX_STRING_SIZE = STANDARD 4000字节

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

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

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

在PL / SQL上下文中things are slightly different。您定义的用于选择函数结果的变量必须足够大,以便生成的值,并且您给出的大小可能不是您所期望的,具体取决于您的默认length semantics。您可以更明确地指定,例如,以下任何一个:

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

两者之间的区别实际上是这些变量中的任何一个都可以接受4000个单字节字符,但第一个也可以接受多达4000个多字节字符(最多可达到32767字节的硬限制),而第二个仍然会出现错误如果总字节数超过4000,则为4000个多字节字符。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.