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

时间:2016-02-04 11:53:47

标签: sql oracle plsql

我在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的固定大小的情况下执行此操作。

2 个答案:

答案 0 :(得分:4)

PL / SQL允许FruitModel.prototype = { getFruit: function(fruit_id,callback) { $.getJSON(this._api + fruit_id, function(data){ callback(data); }); } } $(function(){ var fruits = new FruitModel("/fruit/"); fruits.getFruit(123, function(data){ console.log(data); }); }); 类型最多包含32,767个字节(请参阅here)。这可能足以满足您的需求。请注意,Oracle表中存储的数据限制为4,000(请参阅here)。 (在我看来,不同的长度似乎是一个残酷的恶作剧,虽然我理解其根本原因。)

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

答案 1 :(得分:2)

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

result_key     VARCHAR2 (4000) := 'test';

的长度为4,而不是4000.所以,如果你要使用大字符串并且不确定它们的大小(但确定它们没有达到极限) - 尽可能使用戈登已经提到的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个字符