在Oracle APEX中,我不能在CLOB中追加超过32kb的数据
我将文本存储在数据库表中,许多短行大约70-90个字符长的字段。(指历史原因)。我想将这些字段(行)附加到APEX(CKEditor)中的CLOB中,在许多情况下它都会执行32k。 我试过很多方法,但似乎有一些局限性。只要文本小于32k,我的代码就可以正常工作!我的计划是将它保存在一个新表中,并在那里使用clob。我有APEX 5.01。 当超过32k时,我得到“ORA-06502:PL/SQL:numeric or value error”在Oracle APEX中,我不能在CLOB中追加超过32kb的数据,oracle,plsql,oracle-apex,Oracle,Plsql,Oracle Apex,我将文本存储在数据库表中,许多短行大约70-90个字符长的字段。(指历史原因)。我想将这些字段(行)附加到APEX(CKEditor)中的CLOB中,在许多情况下它都会执行32k。 我试过很多方法,但似乎有一些局限性。只要文本小于32k,我的代码就可以正常工作!我的计划是将它保存在一个新表中,并在那里使用clob。我有APEX 5.01。 当超过32k时,我得到“ORA-06502:PL/SQL:numeric or value error” declare l_clob CLOB;
declare
l_clob CLOB;
l_seq number;
cursor textrader_cur is
SELECT F1NR,FHTTYP,RADNR,FHTEXT,DATUM,UPPTAGEN,NUSER FROM DATATXT WHERE DATATXT.F1NR = :P10_F1NR ORDER BY F1NR,FHTTYP,RADNR;
TYPE datatext_typ IS TABLE OF DATATXT%ROWTYPE INDEX BY PLS_INTEGER;
l_datatext datatext_typ;
begin
l_clob := empty_clob();
DBMS_LOB.CREATETEMPORARY(l_clob,true);
apex_collection.create_or_truncate_collection(p_collection_name => 'TEXT');
select count(1) into x from DATATXT@HUMANAUTV WHERE DATATXT.F1NR = :P10_F1NR;
if x > 0 then
open textrader_cur;
loop
fetch textrader_cur bulk collect into l_datatext LIMIT 200;
for indx in 1..l_datatext.COUNT loop
y := length(l_datatext(indx).fhtext);
dbms_lob.writeappend (l_clob,y,l_datatext(indx).fhtext);
--l_clob := l_clob || l_datatext(indx).fhtext; -- This causes same error
end loop;
EXIT WHEN l_datatext.COUNT = 0;
end loop;
close textrader_cur;
l_seq := apex_collection.add_member(p_collection_name => 'TEXT',
p_d001 => sysdate,
p_d002 => sysdate,
p_n001 => dbms_lob.getlength(l_clob),
p_clob001 => l_clob);
-- :P10_WP := l_clob;
SELECT clob001 into :P10_WP FROM APEX_COLLECTIONS WHERE SEQ_ID = l_seq AND COLLECTION_NAME='TEXT';
end if;
end;
问题是代码中的最后一行。会话状态变量(例如,
P10\u WP
)都是VARCHAR2
,并且限制为32767个字符。您可以在调用它们()的APEX函数中看到这一点。因此,不能为PL/SQL页面项分配超过32k个字符
但是很明显,您可以在一个HTML表单项中放置超过32k个字符!因此,这是一个棘手的解决方法——您必须在不使用APEX页面项的情况下,将clob数据进出HTML表单项。通常,这是通过将clob写入集合,然后使用AJAX调用应用程序进程来检索它来完成的,因为JavaScript不存在字符限制问题
看起来您已经通过文本
集合实现了这一点,但您仍然需要编写自己的随需应变应用程序流程,以便将集合加载到JavaScript中,并将其放入HTML表单项中。如果将内置的apex.ajax.clob
功能与clob\u内容
集合一起使用,将会更容易
我看了几篇关于这方面的文章,然后
简短的版本是将代码中的集合名称更改为CLOB_CONTENT
,然后将此JavaScript函数放在页面上并调用它
function clob_get(){
var clob_ob = new apex.ajax.clob(
function(){
var rs = p.readyState
if(rs == 1||rs == 2||rs == 3){
$x_Show('AjaxLoading');
}else if(rs == 4){
$s('P10_WP',p.responseText);
$x_Hide('AjaxLoading');
}else{return false;}
}
);
clob_ob._get();
}
APEX中的PL/SQL限制为32k,PL/SQL将CLOB视为varchar,仅此而已。我的问题无法在APEX中解决。PL/SQL提供了一个dbms_lob包来操作此数据类型。我在另一种技术(zope/python)中解决类似问题的方法是创建一个框架: 为了从数据库中读取数据,它以多行的形式返回数据 为了写入数据库,它将以多重调用的方式发送数据,服务器最终将其合并
您可以看到这里不,它不在最后一行:P10_WP是一个富文本编辑器(clob)。如果我在:P10_WP的赋值上加上注释,我仍然会得到相同的错误。如果我在“db,s_lob.writeappend”上添加备注,则没有错误。如果我限制循环,那么我认为您的javaScript示例是可以的,但问题是从数据库表填充clob,而不是分配表单项