节能与甲骨文的Apex检索CLOB数据大于32K

问题描述 投票:4回答:1

我的目标是从数据库中检索CLOB数据到一个的Oracle APEX应用一个文本,然后可以将其保存到从textarea的本身上按下“保存”按钮数据库。我也有是非CLOB领域本页面的其他领域(如文本框),并需要将它们保存在数据库中,以及在点击按钮。

对于这一点,我使用的是在“HTML标题和正文属性”页面下面的代码。这是用来检索/保存CLOB到文本区域/数据库。需要注意的是顶点项目中一个简单的PLSQL代码就足够做我在这里,但只是在做什么,如果CLOB数据小于32K字节。我使用这个功能,由于在顶点PLSQL 32K限制(和4K限制使用SQL时)。

function clob_set(){  
        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('P5075_RESPONSETEXT',p.responseText);  
                    $x_Hide('AjaxLoading');  
                }else{return false;}  
            }  
        );  

        if(!$v_IsEmpty('P5075_STYLESHEET')){clob_ob._set($v('P5075_STYLESHEET'))};  
    }  

    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('P5075_STYLESHEET',p.responseText);  
                    $x_Hide('AjaxLoading');  
                }else{return false;}  
            }  
        );  
        clob_ob._get();  
    }

我打电话的功能之一在“页面HTML身体属性”为的onload =“JavaScript的:clob_get();”

我对这个头处理后PLSQL。

declare
l_clob clob:= empty_clob();

begin

if apex_collection.collection_exists(p_collection_name=>'CLOB_CONTENT') then
apex_collection.delete_collection(p_collection_name=>'CLOB_CONTENT');
end if;

apex_collection.create_or_truncate_collection(p_collection_name=>'CLOB_CONTENT');
dbms_lob.createtemporary( l_clob, false, dbms_lob.SESSION );

SELECT xslt
INTO l_clob
FROM schematransform
WHERE namn = 'f';

apex_collection.add_member(p_collection_name => 'CLOB_CONTENT',p_clob001 => l_clob);
end;

这是工作就好了。现在,我有一个PLSQL过程,保存在CLOB和非CLOB字段到数据库中输入的详细信息。但是,只要页面提交,我得到一个“HTTP错误的请求”。

任何人都可以请解释为什么会出现这种情况,如何能我解决这个问题?

plsql onload oracle-apex clob
1个回答
0
投票

这是apex.ajax.clob代码,从apex_4_1.js采取:

/**
 * @namespace = apex.ajax
 */
apex.ajax = {
    /*clob*/
    clob : function (pReturn){
        var that = this;
        this.ajax = new htmldb_Get(null,$x('pFlowId').value,'APXWGT',0);
        this.ajax.addParam('p_widget_name','apex_utility');
        this.ajax.addParam('x04','CLOB_CONTENT');
        this._get = _get;
        this._set = _set;
        this._return = !!pReturn?pReturn:_return;
        return;
        function _get(pValue){
            that.ajax.addParam('x05','GET');
            that.ajax.GetAsync(that._return);
        }
        function _set(pValue){
            that.ajax.addParam('x05','SET');
            that.ajax.AddArrayClob(pValue,1);
            that.ajax.GetAsync(that._return);
        }
        function _return(){
        if(p.readyState == 1){
            }else if(p.readyState == 2){
            }else if(p.readyState == 3){
            }else if(p.readyState == 4){
              return p;
            }else{return false;}
        }
    },

因此,CLOB设置和获取是真正asynchronuous。您发布的代码提供当请求完成(以完成htmldb_get)被称为处理功能。我认为这是一个丑陋的解决方法,但确定。我们需要处理这个函数的代码为我们提交的工作。由于集是异步,我们不能肯定的是,集已发生之前的页面不会被提交。为了防止这种情况,修改你的clob_set代码这样的:

function clob_set(pSubmit){
   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){
             //here the clob has actually been saved, and
             // the ajax call finished
            $s('P5075_RESPONSETEXT',p.responseText);
            $x_Hide('AjaxLoading');

            //pSubmit is a new param
            //use it to check if set has been called for
            //a page submit or not
            if(pSubmit){
               //disable the clob field: it should not be
               //substituted to the session state!!
               $('#P5075_STYLESHEET').prop("disabled", true);
               //actually submit the page. This will submit
               //all fields to session except the disabled ones
               apex.submit('SUBMIT');
            };
         }else{
            return false;
         };
      });

   if(!$v_IsEmpty('P5075_STYLESHEET')){
      clob_ob._set($v('P5075_STYLESHEET'));
   };
};

改变你的提交按钮,并且有它的行动由一个动态的动作来定义。你需要做的是为了防止您的CLOB字段的到会话的替代,通过默认的进程。它创建JavaScript的执行,呼吁clob_set与pSubmit集的动态行为:

clob_set(true);

难道非要看看apex.submit api description。也懂得如何按钮的工作原理:它提交页面,将设置请求到该按钮的名称(或其他请求值,如果明确定义)。

例如,一个按钮可以被命名为“APPLY_CHANGES”,并有一个标签“更改”。如果使用例如内置排处理这一点很重要。该请求值将确定SQL动作将被调用它,你可以在这个过程中的详细信息视图的可能值,旁边的复选框插入/更新/删除。

在这里,最有帮助的美丽的流程图:

© www.soinside.com 2019 - 2024. All rights reserved.