Sql 大型nvarchar2值返回时出现oracle存储过程错误

Sql 大型nvarchar2值返回时出现oracle存储过程错误,sql,oracle,stored-procedures,nvarchar,Sql,Oracle,Stored Procedures,Nvarchar,我们已经编写了一个返回nvarhar2的oracle函数。当它返回像“hello”这样的小值时,它可以正常工作。但是,当nvarchar2变长(约3000个字符)时,它返回“ORA-06502:字符串缓冲区太小”错误。函数返回值的大小是否有限制 我们使用如下函数: SELECT sampleFunction('sampleArg') FROM DUAL; 数据类型是。对于NVARCHAR2它说: 具有最大长度字符的可变长度Unicode字符串。必须为nvarhar2指定大小。字节数最多可以是A

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

我们使用如下函数:

SELECT sampleFunction('sampleArg') FROM DUAL;
数据类型是。对于
NVARCHAR2
它说:

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

  • 如果
    MAX\u STRING\u SIZE=EXTENDED

  • 如果
    MAX\u STRING\u SIZE=STANDARD,则为4000字节

有关
MAX\u STRING\u SIZE
初始化参数的更多信息,请参阅扩展数据类型

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

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

在PL/SQL上下文中。您定义的用于选择函数结果的变量必须足够大,才能生成值,并且根据您的默认值,您为其指定的大小可能与您期望的大小不尽相同。您可以更明确地指定,例如,使用以下任一项:

declare
  variable1 nvarchar2(4000 char);
  variable2 nvarchar2(4000 byte);
...
这两个变量之间的区别在于,这两个变量中的任何一个都可以接受4000个单字节字符,但第一个变量也可以接受多达4000个多字节字符(最多达到32767字节的总硬限制),而第二个变量在总字节数超过4000个时仍然会出错,但不超过4000个多字节字符


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

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

存储函数结果的变量的大小有一个限制考虑更改函数,以便返回<代码> nCulb < /代码>?这可能满足您的需要,也可能不满足您的需要-这取决于您如何使用函数值,例如,您将无法按
NCLOB
进行分组或排序,但它将允许您几乎无限长。