我有一个CRUD页面,APEX(版本5)中的表单,相应的表有两个CLOB字段。我需要修改同一页面上的两个字段。我知道一个非常普遍的已知解决方案,它使用集合APEX_COLLECTION和Processes来加载CLOB字段并更新修改后的值。
/** PL/SQL for loading the CLOB field */
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 DS_CONCLUSAO
into l_clob
from CR_RELATORIO
where ID_RELATORIO = :P15_ID_RELATORIO;
apex_collection.add_member(p_collection_name => 'CLOB_CONTENT',p_clob001 => l_clob);
end;
/** Javascript Functions for loading and setting the field on the page */
<script type="text/javascript">
function clob_set(campo, operacao){
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(campo,p.responseText);
$x_Hide('AjaxLoading');
apex.submit(operacao);
}else{return false;}
}
);
if (!apex.item(campo).isEmpty()) {
clob_ob._set($v(campo));
}
}
function clob_get(campo){
if ($v(campo) != null && $v(campo) != '') {
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(campo,p.responseText);
$x_Hide('AjaxLoading');
}else{return false;}
}
);
clob_ob._get();
}
}
</script>
我正在尝试使用此解决方案,但问题是:该集合只有一个空间用于CLOB字段,我需要两个(或更多)空间用于DB表上的两个CLOB字段< /强>
我尝试在同一页面上创建两个不同的APEX_COLLECTIONS,名称不同,但不起作用。
答案 0 :(得分:1)
APEX_COLLECTION
只是会话老化后自动清除的表的一个方便的包装器。
在你的情况下,我自己创建了一个表,将SESSION_ID作为密钥的一部分,然后为它实现我自己的清除过程。