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;
).
我有一个页面项目 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;
).