Plsql Application Express:匿名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

在匿名PL/SQL块进程中,我遇到了一个将页面项的值绑定到声明变量的问题

问题是在满足条件之前,页面项(:P4550_REQUESTOR)没有填充值。PL/SQL块进程似乎在加载页面后立即将变量绑定到空值,尽管该进程在单击特定按钮之前不会启动

这是我的密码:

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”值
  • 有一个已定义的PL/SQL代码块,该代码块设置为在按下
    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}
  • 的状态在此时没有从初始空值更改…在选择提交按钮之后)
  • submit按钮执行定义的PL/SQL过程块:
    {MyPage:RunCodeBlock}
  • 用例3

  • 用户从
    {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;