Oracle APEX无法将值保存到会话中



我有一个页面项P2_ITEM_TYPE_ID,它使用一个调用PL/SQL:的进程在预渲染中设置

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。

现在,我想通过点击页面上的一张卡片,获取其ID并将页面项目P2_ITEM_TYPE_ID设置为该ID来设置ITEM_TYPE_ 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的会话更改而没有出现问题

您不需要apex.server.process,您可以使用执行PL/SQL代码操作将项的值发布到服务器,该操作遵循您已经拥有的javascript操作。将项目名称(例如P2_ITEM_TYPE_ID(放在要提交的项目属性中(将PL/SQL代码设置为仅null;(。

如果除了EXCEPTION部分之外,这些页面上的所有内容都是一样的,那么有一个解决方法:使用聚合函数,例如

select max(ITEM_TYPE_ID) INTO :P2_ITEM_TYPE_ID from TABLE1 where ITEM_ID = :P2_ITEM_ID;

如果:P2_ITEM_ID没有值,它将阻止查询返回NO_DATA_FOUND,并将NULL存储到:P2_ITEM_TYPE_ID中。

最新更新