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

标签 oracle plsql oracle10g long-integer varchar2

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

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

最佳答案

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 参数,但我认为您所描述的情况并非如此。

关于oracle - 在oracle SP中用更大的数据类型替换varchar2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17354503/

相关文章:

SQL - 选择具有不同组 ID 的用户对

oracle - 为什么我得到PLS-00302:组件存在时必须声明?

sql - 2列的移动平均值

oracle - 有没有办法解决 Oracle 中的更改通知问题?

sql - 交换两个主键值并规避ORA-00001的更好方法:违反唯一约束?

sql - Oracle 中相当于 SQL Server 的 SET NOCOUNT ON 的是什么?

java - Tomcat 是否使用 pl/sql 模块的缓存版本?

sql - 使用可选参数创建过程的方法?

oracle10g - 在 PostgreSQL 中显示链接服务器

oracle - 使表中的行在 oracle 上只读?