在 oracle SP 中用更大的数据类型替换 varchar2

Posted

技术标签:

【中文标题】在 oracle SP 中用更大的数据类型替换 varchar2【英文标题】:Replacing varchar2 with bigger data type in oracle SP 【发布时间】:2013-06-27 22:47:45 【问题描述】:

我正在使用 oracle 版本 10。 PL/SQL 中有一个使用 varchar2 变量的存储过程。 该代码不断附加 varchar2 变量。 当 varchar2 变量大小超过 32767 时,它不能再追加任何值。 现在我想将数据类型更改为 long 或 clob(以容纳更多字符),它不起作用。 如何修改此处的代码,使其具有与clob或long相同的附加功能?

示例附加 x:= x || '我的数据';

【问题讨论】:

long 已被弃用很长时间(没有双关语),并且有限制。坚持clob @AlexPoole,我通过将数据类型更改为 clob 进行测试,它不起作用。 我的意思是您应该寻找clob 解决方案,根本不应该考虑long。我并不是说你可以像varchar2 那样连接。您可能想要dbms_lob.writeappend(),但我目前只能发布仅链接的答案... 【参考方案1】:

long 数据类型已弃用;如果可以的话,你应该认真考虑migrating your long column to a clob

如果您使用的是 clob,您可以像这样追加超过 32k varchar2 限制:

declare
  l_clob clob;
begin
  dbms_lob.createtemporary(l_clob, true);
  dbms_lob.open(l_clob, dbms_lob.lob_readwrite);
  dbms_lob.writeappend(l_clob, 4, '1234');
  for i in 1..10000 loop
    dbms_lob.writeappend(l_clob, 5, '.5678');
  end loop;
  dbms_output.put_line('CLOB length: ' || length(l_clob));
  dbms_lob.close(l_clob);
  dbms_lob.freetemporary(l_clob);    end;
/

CLOB length: 50004

您可以使用连接运算符|| 附加到long,但正如您已经看到的那样,最多只能达到32k。在 PL/SQL 中没有简单的方法来处理高于该值的 long 值。你也许可以用dbms_sql 做一些事情,但如果有可能将表格列切换到clob,那真的不值得。


如果你想将 clob 传回给调用者,并且它是一个临时的 clob,它必须由调用者定义并在创建后传递:

create or replace procedure proc1 as
  l_clob clob;
begin
  dbms_lob.createtemporary(l_clob, true);

  proc2(l_clob);
  dbms_output.put_line('proc1 CLOB length: ' || length(l_clob));

  dbms_lob.freetemporary(l_clob);
end;
/

create or replace procedure proc2(p_clob in out clob) as
begin
  dbms_lob.open(p_clob, dbms_lob.lob_readwrite);
  dbms_lob.writeappend(p_clob, 5, '12345');
  for i in 1..9999 loop
    dbms_lob.writeappend(p_clob, 5, '.56789');
  end loop;
  dbms_output.put_line('proc2 CLOB length: ' || length(p_clob));
  dbms_lob.close(p_clob);
end;
/

exec procs;

proc2 CLOB length: 50000
proc1 CLOB length: 50000

否则,就调用者而言,该对象将不存在。

如果 clob 存在 - 例如,从表中选择,因此您不需要 createtemporary 调用 - 那么您可以将其分配给 out 参数,但我不认为这是你所描述的情况。

【讨论】:

谢谢@Alex,很有帮助,我只想知道如何从这个 clob 返回值。 @user215005 - 返回到哪里,如何返回?您是在尝试从 proc 插入/更新 long 列,还是将值传递回将执行插入/更新的客户端? 这是一个从另一个 SP 调用的带有 out 参数的 SP。所以需要将 clob var 的值返回给被调用的 SP @user215005 - 输出参数是clob 还是long,甚至是varchar2?它需要是 clob 才能工作,在调用者中有 createtemporary 等。但是它是否仍然必须在某个时候变成long,这在PL/SQL 中将是困难和不可能之间的某个地方,还是现在也将它存储为clob?在您的问题中显示整个过程、数据类型以及每一步的客户端/语言是什么会很有用。将列更改为 clob 确实是唯一可行的策略。 我同意你的观点@Alex,out 参数目前很长,我正在改变它。只是想知道如何将临时 clob 值分配给这个输出参数。

以上是关于在 oracle SP 中用更大的数据类型替换 varchar2的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - 如何检查多条记录中的值以及一个值是不是匹配 - 将其用于更大的数据集

在 Oracle 中用 RegEx 替换列中的值

从更大的组中分组数字

c_cpp 用一个更大的值替换两个连续的相等值

在 sql [Xampp] 中导入更大的数据库 - MAC OS

在 oracle 中用 Unpivot 替换 union all