Plsql 仅更新和通过电子邮件发送Oracle Apex中表格行中的已检查记录

Plsql 仅更新和通过电子邮件发送Oracle Apex中表格行中的已检查记录,plsql,oracle-apex,Plsql,Oracle Apex,在Oracle Apex中的表格形式中,如何使其仅更新选中的行,以及将此过程放在何处 是否将其作为条件添加到现有的ApplyMRU进程中 我现在只是停留在一个表格的地方,我只想让它更新已签出的行,然后发送一封电子邮件,让人们知道该记录的状态已更改 我试着根据一个建议的时间和日期来做这件事,但它发出了每一首我需要的歌 这是当前无法正常工作的电子邮件代码,我不想直接从表中提取它,我希望它使用表格表单上的字段,只通过电子邮件发送已签出的行 DECLARE l_id NUM

在Oracle Apex中的表格形式中,如何使其仅更新选中的行,以及将此过程放在何处

是否将其作为条件添加到现有的ApplyMRU进程中

我现在只是停留在一个表格的地方,我只想让它更新已签出的行,然后发送一封电子邮件,让人们知道该记录的状态已更改

我试着根据一个建议的时间和日期来做这件事,但它发出了每一首我需要的歌

这是当前无法正常工作的电子邮件代码,我不想直接从表中提取它,我希望它使用表格表单上的字段,只通过电子邮件发送已签出的行

DECLARE  
   l_id           NUMBER;
   l_index        NUMBER;
   l_vc_arr2      apex_application_global.vc_arr2;
   lc_message     VARCHAR2 (4000);
   l_pkey         NUMBER;
   l_date_wrote   DATE;
   l_sales        VARCHAR2 (4000);
   l_client       VARCHAR2 (4000);
   l_job          VARCHAR2 (4000);
   l_who          VARCHAR2 (4000);
   l_date_covered DATE;
BEGIN  
   FOR c1  
      -- Retrieve reqs primary key that have been covered  
      -- in the last 2 seconds by the salesman  
   IN (SELECT pkey  
       FROM reqs 
       WHERE  TO_CHAR ( (SYSDATE), 'MM/DD/YYYY HH:MI:SS') < (TO_CHAR ( (date_covered + 1 / 10800), 'MM/DD/YYYY HH:MI:SS'))     
       AND  sales = :p14_sales  
       AND covered IS NOT NULL)  
   -- Send an email for each req that has been covered  
   LOOP  
      SELECT date_wrote,  
             sales,  
             client,  
             job,  
             Who, 
             date_covered  
        INTO l_date_wrote,  
             l_sales,  
             l_client,  
             l_job,  
             l_who,  
             l_date_covered 
        FROM reqs  
       WHERE pkey = c1.pkey;  
      lc_message := 'Date Written   :' || l_date_wrote || CHR (10);  
      lc_message := lc_message || 'Sales          :' || l_sales || CHR (10);  
      lc_message := lc_message || 'Client         :' || l_client || CHR (10);  
      lc_message := lc_message || 'Position       :' || l_job || CHR (10);  
      lc_message := lc_message || 'Who Covered       :' || l_who || CHR (10);  
      lc_message := lc_message || 'Date Covered           :' || l_date_covered || CHR (10);  
      l_id := APEX_MAIL.SEND(  
            p_to     => 'some.name@somedomain.com',  
            p_from   => 'DO_NOT_REPLY@REQS',  
            p_subj   =>    ''  
                        || l_who  
                        || ' Has Covered '  
                        || l_job  
                        || ' at '  
                        || l_client  
                        || CHR (10),  
            p_body   => lc_message);  
      COMMIT;  
      apex_mail.push_queue ();  
   END LOOP;  
END;
在这件事上我的头撞到了墙上


谢谢

您需要使用PLSQL在正确的数组上循环。表格形式的项映射到会话状态中的几个数组。 在这种情况下,复选框是特殊情况,因为未选中复选框时,它们不会在这些数组中创建条目。

例如,我在EMP上有一个表格,并且有一个[row selector]列。

在网页上:

然后我在提交过程中有以下内容:

-- loop over array f01
-- this will be the array holding the values for a checkbox column (in this case, the row selector pseudo column)
FOR i IN 1..apex_application.g_f01.count 
LOOP
  -- show what is in array f01
  -- this will be the index position of the checked row in case of the row selector
  apex_debug.message('Value of array f01 at position'||i||': '||apex_application.g_f01(i));
  -- array f02 will be the next editable (or session state saving) column, in my case a display-but-session-state-saving column with the EMPNO
  apex_debug.message('Value of array f02 at position'||apex_application.g_f01(i)||': '||apex_application.g_f02(apex_application.g_f01(i)));
END LOOP;
调试中的输出:

Value of array f01 at position1: 2
Value of array f02 at position2: 7698
Value of array f01 at position2: 4
Value of array f02 at position4: 7566
因此,需要注意的是:

与任何表格形式一样,请注意列如何映射到数组。 在这种情况下,位置很重要,因此切换列将改变位置 它们将映射到的数组 复选框列在未选中时不会在其各自的数组中创建行 在数组上循环时,这很重要,必须选中复选框列 这些技术在处理手动表格表单时非常常用,而手动表格表单使用

因此,要使您的电子邮件系统正常工作,请在复选框列上循环,从另一个数组中检索PK,然后像在当前循环中一样发送邮件

例如:

我获取了您的代码示例并对其进行了修改。请注意,我改变了一些事情:

为便于使用,删除了每个字段的变量,改为使用rowtype变量 删除了提交 将队列推到循环之后
我真的很感谢你的帮助,但我正在努力想办法做到这一点,我不是开发人员,而是在学习。我正试图弄清楚这在电子邮件循环中是如何构成的。可能没有真正简单的方法来解释这一切。我建议只看一下链接的文档,试着理解表格形式的项是如何被替换为会话状态的。一旦你掌握了这一点,这应该会更清楚。最简单的方法,imo:根据emp表创建一个新页面,页面上有一个表格。然后创建一个进程,其中包含一些调试行,以了解调试中运行页面上的内容,然后查看调试。因此,在这个数组上循环与在光标上循环非常相似:在数组上循环,并在循环中选择必要的数据,然后发送邮件。Tom,我确实阅读了附加的链接,我确实了解如何调用数组,这是如何将其正确地组织到我的电子邮件过程中,这就是我被卡住的地方。我添加了一个代码示例。注意:我改变/简化了一些事情!
DECLARE  
   l_checked_row  NUMBER;
   l_id           NUMBER;
   lc_message     VARCHAR2 (4000);
   l_pkey         NUMBER;
   l_r_reqs       reqs%ROWTYPE; 
BEGIN  
  FOR i IN 1..apex_application.g_f01.count 
  LOOP  
    l_checked_row := apex_application.g_f01(i);
    -- assuming that array F02 maps to column PKEY from table REQS
    l_pkey        := apex_application.g_f02(l_checked_row);

    -- get details required for creating the mail body
    -- It's generally easier to just fetch the row instead of having to 
    -- define variables to cover every field you need.
    SELECT *  
      INTO l_r_reqs
      FROM reqs  
     WHERE pkey = l_pkey;  
    -- Dont forget that select into may generate no_data_found or too_many_rows !

    lc_message :=               'Date Written   :'         || l_r_reqs.date_wrote   || CHR (10);  
    lc_message := lc_message || 'Sales          :'         || l_r_reqs.sales        || CHR (10);  
    lc_message := lc_message || 'Client         :'         || l_r_reqs.client       || CHR (10);  
    lc_message := lc_message || 'Position       :'         || l_r_reqs.job          || CHR (10);  
    lc_message := lc_message || 'Who Covered       :'      || l_r_reqs.who          || CHR (10);  
    lc_message := lc_message || 'Date Covered           :' || l_r_reqs.date_covered || CHR (10);  
    l_id := APEX_MAIL.SEND(  
          p_to     => 'TESTER@TEST.com',  
          p_from   => 'DO_NOT_REPLY@REQS',  
          p_subj   =>    ''  
                      || l_r_reqs.who  
                      || ' Has Covered '  
                      || l_r_reqs.job  
                      || ' at '  
                      || l_r_reqs.client  
                      || CHR (10),  
          p_body   => lc_message);        
    -- avoid commits unless ab-so-lu-te-ly necessary. Apex implicit commits can make the flow hard enough to
    -- understand as it is.
  END LOOP;

  apex_mail.push_queue ();
END;