是否可以创建动态 varchar2 变量?

Posted

技术标签:

【中文标题】是否可以创建动态 varchar2 变量?【英文标题】:Is it possible to create dynamic varchar2 variable? 【发布时间】:2016-02-04 11:53:46 【问题描述】:

我在 PLSQL 中有一个函数,它对字符串进行操作并返回 VARCHAR2 类型。

这个函数中的一个变量是

result_key     VARCHAR2 (4000) := '';

当它处理大量数据时,我收到ORA-06502: PL/SQL: numeric or value error: character string buffer too small 错误。

似乎我必须扩展我的 result_key 变量。我看到的唯一解决方案是将result_key 声明为

result_key     VARCHAR2 (8000) := '';

我想知道是否可以在不声明result_key 的固定大小的情况下做到这一点。

【问题讨论】:

从 11g R1 开始,您可以通过定义具有最大长度的变量来使您的 varchar2 变量大小为“动态”:varchar2(32767)。有关详细信息,请参阅***.com/q/24831972/272735。但是 32767 字节是硬限制。如果您的数据不符合限制,那么您必须切换到clob 【参考方案1】:

PL/SQL 允许varchar2() 类型最多有 32,767 个字节(请参阅here)。这可能足以满足您的目的。请注意,存储在 Oracle 表中的数据限制为 4,000(请参阅here)。 (在我看来,不同的长度似乎是一个残酷的恶作剧,虽然我明白其中的原因。)

一般来说,较长字符串的类型是CLOB——字符较大的二进制对象。它们的行为很像 char/varchar,它们可以存储在表中以及 PL/SQL 变量中。一个缺点是查看值的最简单方法是将它们复制到 PL/SQL 中的varchar2()

【讨论】:

【参考方案2】:

对于 PL/SQL 中的 varchar2 变量,您必须声明其长度。请注意,它的实际长度始终是真实长度,因为它们只使用所需的空间。例如

result_key     VARCHAR2 (4000) := 'test';

长度为 4,而不是 4000。因此,如果您要使用大字符串并且不确定它们的大小(但确保它们不会达到限制) - 使用 Gordon 已经存在的最大可能 32767提及。但请记住,PL/SQL 可以处理比 SQL (4000) 更大的字符串,因此在尝试混合这些字符串时要小心,例如将变量插入表中。如果您不确定它们的最大尺寸并且它们可能会超过该尺寸,请使用 CLOB。

但再次在使用 CLOBS 并将它们复制到 varchar2 时,为避免您已经知道的错误,请始终使用 dbms_lob.substr(),例如:

dbms_lob.substr(clob_name, [limit], [offset]);
dbms_lob.substr(clob_name, 4000, 1);

在本例中 - 从 clob_name 中提取前 4000 个字符

【讨论】:

以上是关于是否可以创建动态 varchar2 变量?的主要内容,如果未能解决你的问题,请参考以下文章

oracle中varchar2类型与integer类型的变量进行运算

是否可以在 SASS 每个循环中动态使用变量名? [复制]

C#格式字符串

是否可以从动态变量实例化一个类?

Oracle之绑定变量 2

是否可以在Java中动态生成变量名称?