在Oracle APEX中,我不能在CLOB中追加超过32kb的数据

在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;

我将文本存储在数据库表中,许多短行大约70-90个字符长的字段。(指历史原因)。我想将这些字段(行)附加到APEX(CKEditor)中的CLOB中,在许多情况下它都会执行32k。 我试过很多方法,但似乎有一些局限性。只要文本小于32k,我的代码就可以正常工作!我的计划是将它保存在一个新表中,并在那里使用clob。我有APEX 5.01。 当超过32k时,我得到“ORA-06502:PL/SQL:numeric or value error”

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,而不是分配表单项