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

时间:2018-11-12 20:43:38

标签: oracle oracle-apex oracle-apex-5.1

我有一个页面项目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的会话没有问题

2 个答案:

答案 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中。