Plsql Application Express:匿名PL/SQL块和绑定变量
在匿名PL/SQL块进程中,我遇到了一个将页面项的值绑定到声明变量的问题 问题是在满足条件之前,页面项(:P4550_REQUESTOR)没有填充值。PL/SQL块进程似乎在加载页面后立即将变量绑定到空值,尽管该进程在单击特定按钮之前不会启动 这是我的密码:Plsql Application Express:匿名PL/SQL块和绑定变量,plsql,oracle11g,oracle-apex,Plsql,Oracle11g,Oracle Apex,在匿名PL/SQL块进程中,我遇到了一个将页面项的值绑定到声明变量的问题 问题是在满足条件之前,页面项(:P4550_REQUESTOR)没有填充值。PL/SQL块进程似乎在加载页面后立即将变量绑定到空值,尽管该进程在单击特定按钮之前不会启动 这是我的密码: DECLARE v_email_to app_user.email%type; v_requestor VARCHAR2(15); BEGIN v_requestor := :P4550_REQUESTOR; BEGIN
DECLARE
v_email_to app_user.email%type;
v_requestor VARCHAR2(15);
BEGIN
v_requestor := :P4550_REQUESTOR;
BEGIN
SELECT email INTO v_email_to
FROM app_user
WHERE userid = v_requestor;
END;
SEND_APEX_MAIL (
v_email_to,
'Your vacancy request has been rejected.'
|| chr(10)
|| 'Emailed to: ' || v_email_to
|| chr(10)
|| 'Requestor: ' || v_requestor,
'Vacancy Request Rejected'
);
END;
有人对此有什么想法吗
如果我将一个值硬编码给v_请求程序,那么该块就可以正常工作。如果在页面加载后尝试获取P4550_REQUESTOR的值,则该值为空。单击编辑按钮后,将填充P4550_请求者
****更多详细信息*****
P4550_REQUESTOR是位于空缺申请区域内的页面项,仅在满足条件时显示。具体来说,条件是一个编辑按钮,与页面加载时创建的表行关联。单击“编辑”按钮可显示详细信息区域,并填充关联的页面项目
空缺请求区域中的页面项值通过自动行提取填充,该行提取在标题后激发
P4550_请求程序的源类型为DB列
触发上述代码的过程设置为在提交时触发-在计算和验证之后
如果我在页面加载时记录P4550_REQUESTOR的值,它将显示null。如果在单击“编辑”按钮后记录该值,则会得到预期的字符串值 Oracle-APEX中的流程控制
(在其他编程规程和环境中考虑这一点实际上很有用。)
问题定义
问题是在满足条件之前,页面项(:P4550_REQUESTOR)没有填充值。PL/SQL块进程似乎在加载页面后立即将变量绑定到空值,尽管该进程在单击特定按钮之前不会启动
以Apex术语重新编写并以实际问题的形式呈现的问题陈述:
报告区域
,其中包含直接引用数据表/视图的结果。此报告由一个名为“自动获取”的Apex进程管理,并通过加载页眉自动启动表单项
,由用户选择的按钮项有条件地填充。按钮项是报告结果的一部分
报告区域
中选择按钮项
,则表单项
将保持未分配状态,并包含一个“null”值SUBMIT按钮
项时执行(也在同一页面上)。为什么我的代码块(已定义的页面进程)在触发时没有先按报告区域中的按钮项
,而是以空值运行
面向过程程序员的事件驱动程序设计
如果你在程序语言的范式下思考,答案并不明显。在不深入讨论该主题的情况下,以下是我精心设计的OP问题空间的视觉布局,以说明如何使问题变得更加明显:
这是我的Apex页面设计的实现。它的通用性足以用作其他Apex设计的模板。此图上没有流箭头,因为它是一个有状态系统。一件事导致另一件事发生等等。。。但并非总是如此,也并非同时如此
Apex UI页面设计的用例
尝试浏览几个用例,以了解图中分解的元素是如何一起工作的。每个用户可以进行任意数量的点击组合和交互,但有一个共同点:
它们在页面加载时都输入相同的初始化条件
它们都通过以下方式离开页面:导航到其他位置或通过SUBMIT按钮事件
用例#1
用户从{MyPage:SQLReport}
中的一条记录中选择{MyPage:SQLReport:ThisButton}
根据{MyPage:SQLReport:ThisButton}#3
,报告记录和按钮项之间的关联值被传递到:{MyPage:HTML区域:ThisButton}
表单项状态已从初始空值更新和更改
用户选择{MyPage:HTML Region:ThisSubmit}
按钮通知系统继续
submit按钮执行定义的PL/SQL过程块:{MyPage:RunCodeBlock}
用例2
用户进入页面并查看{MyPage:SQLReport}
区域中显示的结果
用户决定不需要额外输入,然后选择{MyPage:HTML区域:ThisSubmit}
按钮通知系统继续
(注意:表单项<代码>{MyPage:HTML区域:ThisItem}
的状态在此时没有从初始空值更改…在选择提交按钮之后)
{MyPage:RunCodeBlock}
{MyPage:SQLReport}
中的一条记录中选择{MyPage:SQLReport:ThisButton}
{MyPage:SQLReport:ThisButton}#3
,报告记录和按钮项之间的关联值被传递到:{MyPage:HTML区域:ThisButton}
DECLARE
-- output from this procedure will be recorded in the star_emps_log
-- table. {MyPage:RunCodeBlock}
mycelebrity star_emps.ename%TYPE:= :P17_CELEBRITY_NAME;
mylogmessage star_emps_log.log_message%TYPE;
BEGIN
-- Conditional; changes message based on the value set for the
-- page item.
if mycelebrity is null then
mylogmessage:= 'No button was pressed on the previous page.';
else
mylogmessage:= 'The user selected: ' || mycelebrity ||
' from the report list.';
end if;
-- populate value from the page item.
INSERT INTO star_emps_log (log_message)
VALUES (mylogmessage);
commit;
END;