是否可以创建动态 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 变量?的主要内容,如果未能解决你的问题,请参考以下文章