我有一个页面项目P2_ITEM_TYPE_ID
,该页面项目是使用调用PL / SQL的过程在Pre-Render中设置的:
BEGIN
select ITEM_TYPE_ID INTO :P2_ITEM_TYPE_ID from TABLE1 where ITEM_ID = :P2_ITEM_ID;
exception
when no_data_found then
:P2_ITEM_TYPE_ID := null;
END;
当前,该ITEM_ID的记录在TABLE1中不存在,因此引发了NO_DATA_FOUND异常,并且最初将ITEM_TYPE_ID设置为null。
现在,我要设置ITEM_TYPE_ID,方法是单击页面上的其中一张卡,获取其ID,然后将页面项P2_ITEM_TYPE_ID设置为该ID。
点击卡时,我有一个动态操作运行以下javascript:
var $item_type_id = this.data;
console.log($item_type_id); //prints out correect ID
apex.item("P2_ITEM_TYPE_ID").setValue($item_type_id);
console.log(apex.item("P2_ITEM_TYPE_ID").getValue()); //prints out correct value
//set session state of P2_ITEM_TYPE_ID
apex.server.process ( "SAVE_HIDDEN_VALUE_IN_SESSION_STATE",
{
x01: $item_type_id,
pageItems: "#P2_ITEM_TYPE_ID"
},
{dataType: 'text'} );
我知道代码可以正常工作,因为可以将正确的值打印到控制台,但是当我检查页面的会话时,P2_ITEM_TYPE_ID在会话中为空白。可能是什么问题?
几乎就像是某种东西阻止了值的改变。 我在另一页上进行了相同的设置,但有一点点不同-预渲染中的代码不包含异常部分,因为TABLE1中始终存在该ITEM_ID的记录:
BEGIN
select ITEM_TYPE_ID INTO :P3_ITEM_TYPE_ID from TABLE1 where ITEM_ID = :P3_ITEM_ID;
END;
但是其余代码相同,并且P3_ITEM_TYPE_ID的会话没有问题
答案 0 :(得分:3)
您不需要apex.server.process
,您可以通过执行已执行的javascript操作之后的执行PL / SQL代码操作将项目的值发布到服务器上。将项目名称(例如P2_ITEM_TYPE_ID
)放在要提交的项目属性中(将 PL / SQL代码设置为null;
)。
答案 1 :(得分:1)
如果这些页面上的所有内容都相同,除了EXCEPTION
部分,那么-一种解决方法:使用聚合函数,例如
select max(ITEM_TYPE_ID) INTO :P2_ITEM_TYPE_ID from TABLE1 where ITEM_ID = :P2_ITEM_ID;
如果该NO_DATA_FOUND
没有值,它将阻止查询返回:P2_ITEM_ID
并将NULL
存储到:P2_ITEM_TYPE_ID
中。