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