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

Oracle APEX cannot save a value into a session

我有一个页面项目 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 设置为空。

现在我想设置 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 的会话更改没有问题

如果这些页面上的所有内容都相同,除了 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.

你不需要 apex.server.process,你可以 post 一个项目的价值到服务器 执行 PL/SQL 代码 动作跟在您已有的 javascript 动作之后。将项目名称(例如 P2_ITEM_TYPE_ID)放入 要提交的项目 属性中(将 PL/SQL 代码 设置为 null;).