当前位置: 首页 > 知识库问答 >
问题:

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

谢清野
2023-03-14

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

示例附加x:=x'mydata';

共有1个答案

冯宏浚
2023-03-14

不推荐使用数据类型;如果可以,应该认真考虑将long列迁移到CLOB

如果您使用的是CLOB,您可以追加超过32kvarchar2限制,如下所示:

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中,没有简单的方法来处理值。您可能可以使用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存在-例如从表中选择,因此不需要createtemparory调用-那么您可以将其分配给out参数,但我认为您所描述的情况并非如此。

 类似资料:
  • 概述 JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值。 var x = y ? 1 : 'a'; 上面代码中,变量x到底是数值还是字符串,取决于另一个变量y的值。y为true时,x是一个数值;y为false时,x是一个字符串。这意味着,x的类型没法在编译阶段就知道,必须等到运行时才能知道。 虽然变量的数据类型是不确定的,但是各种运算符对数据类型是有要求的。如果运算

  • JavaScript是一种动态类型语言,变量是没有类型的,可以随时赋予任意值。但是,数据本身和各种运算是有类型的,因此运算时变量需要转换类型。大多数情况下,这种数据类型转换是自动的,但是有时也需要手动强制转换。 强制转换 Number函数:强制转换成数值 String函数:强制转换成字符串 Boolean函数:强制转换成布尔值 自动转换 自动转换为布尔值 自动转换为字符串 自动转换为数值 小结 加

  • 我正在使用此Composer包进行需要此包提供的功能的开发。寻找替代方案,我发现这是我最好的选择,因为可用的替代方案太简单了,无法在我处理的时间限制下实现。 现在,我已经在运行PHP 5.5的本地机器(在LinuxWindows 10的子系统上)和运行PHP 5.6的个人服务器上测试了它,但是正式服运行PHP 5.4,由于原因无法升级。 首先我犯了这个错误: 在寻找解决方案时,我遇到了这个问题,因

  • 问题内容: 在NumPy中,我可以通过以下方式获取特定数据类型的大小(以字节为单位): 要么: 例如: 我有两个问题。首先,有没有一种方法可以在 不创建 数据类型 实例的情况 下获取此信息?其次,和之间有什么区别? 问题答案: 您需要一个的实例来获取itemsize,但不需要一个的实例。(很快就会知道,它是数组的属性,而不是dtype。) 例如 至于之间的区别和,只是。 例如

  • 问题内容: 我想将多列的数据类型从float更改为int。最简单的方法是什么? 尚无数据可担心。 问题答案: http://dev.mysql.com/doc/refman/5.1/en/alter- table.html 这将更改给定列的数据类型 根据您希望修改的列数,最好生成一个脚本或使用某种mysql客户端GUI

  • 我有一个包含n列的数据帧,我想用空值替换所有这些列中的空字符串。 我试过用 和 他们两个都没有工作。 如有任何线索,我们将不胜感激。谢谢