如何在页面提交后识别 pl/sql 内容中的项目值?
How to identify item values in pl/sql content after page submission?
我创建了一个包含 pl/sql 内容区域的页面,我在其中创建了 html table。给出了创建 table 的 pl/sql 代码和 table 的屏幕截图。
该页是向导列表中的第2页,共有4页。因此,当单击第 4 页上的 "Finish" 按钮时,我想将此 html table 的所有行插入数据库 table.
我想知道如何识别 html table 中的值以及如何将这些值插入数据库 table。谁能帮我做这个?
BEGIN
htp.p('
<HTML>
<HEAD>
<TITLE>Organization Records</TITLE>
</HEAD>
<BODY>
<H1>Organization Records</H1>
<TABLE id="DataForm" BORDER="1 " style="border-collapse: collapse; width="100%">
<TR style="width=50%">
<TH>Hierarchy</TH>
<TH>Org Long Name</TH>
</TR>
<TR style="width=50%">
<TH><input type="text"/></TH>
<TH>
<select id="S1" name="S1">
<option value="id1">data1</option>
<option value="id2">data2</option>
<option value="id3">data3</option>
</select>
</TH>
</TR>
</TABLE>
<button type="button" onclick="addRow()">Add</button>
</BODY>
</HTML>
');
结束;
您需要在提交第 2 页时捕获这些值,因为在您提交第 4 页时它们已不存在于 HTML 中。
将 select
的 name
属性更改为 APEX 允许的属性 - 即 "f01"、"f02"、...、"f50" 之一. (有关详细信息,请参阅 docs。)
提交页面后,APEX 将填充相应的数组,例如apex_application.g_f01
、apex_application.g_f02
等
所以你需要做的就是循环遍历相关数组以获取值并将它们插入你的 table:
for i in 1..apex_application.g_f01.count loop
insert into mytable (value) values (apex_application.g_f01(i));
end loop;
真不明白你为什么掉进自己写的圈套HTML。你是在伤害自己,对 APEX 是一种伤害。
根据您提供的内容,您已经证明 plsql 块根本没有用,也不需要生成您自己的 HTML。您甚至 运行 遇到必须将项目从页面映射到后端的问题。
我会更进一步说,你所发布的内容将在你的页面中创建完全无效的 HTML,它起作用的唯一原因是因为你的浏览器(可能不是目标受众的浏览器)是如此宽容无论如何解析它。 (标签 HTML 是一个根标签,只能出现一次。所以这里你在 HTML 文档中堆叠了一个 HTML 文档。检查你的页面源和 运行通过验证器)。
为什么,或者是什么原因,您不必将经典报告与 apex_item api 结合起来使用这种久经考验的方法?或者,为什么不使用可以提供验证和每行处理的表格形式呢?两种方式都是声明式的并且速度很快。
使用经典报告,我只需要一个经典报告区域和一些 SQL,我会更快地发布您在此处编写的相同内容。
select apex_item.text(p_idx => 1, p_value => text_value) hierarchy
, apex_item.select_list_from_query(p_idx => 2, p_value => org_id, p_query => 'select dname, depto from dept') org_name
from my_table
如果使用表格形式,它会更短,因为我不必列出 html。 (并考虑 apex 5.1 的交互式网格...)
此外,您可能需要考虑使用 apex_collection 将您的数据映射到,因为这是一个向导。如果不这样做,您将把数据直接映射到表中,这在向导中通常不是所需的方法。此外,如果发生处理或验证错误怎么办?在表格表单中输入的数据(自行创建或以其他方式)不会在错误时存储,导致表单在重新呈现页面时变为 cleared/reset。
除非你有一个非常好的理由在 apex 中生成你自己的自定义 html,它不能在模板(页面、区域、报告、html 表达式)中捕获,否则不要去做吧。考虑两次。
我也在做一个自定义表单,在组合查询中,表格形式是没有用的,所以你必须自己写一个过程。
正如 Tony 所说,您可以在 apex_application.g_f01
到 apex_application.g_f50
数组中设置值,这些值可以在 p_idx
参数中设置。
例如:APEX_ITEM.HIDDEN(1,empno)
另请参阅(在隐藏示例中解释得更详细):https://docs.oracle.com/cd/E14373_01/apirefs.32/e13369/apex_item.htm#AEAPI196
我创建了一个包含 pl/sql 内容区域的页面,我在其中创建了 html table。给出了创建 table 的 pl/sql 代码和 table 的屏幕截图。
该页是向导列表中的第2页,共有4页。因此,当单击第 4 页上的 "Finish" 按钮时,我想将此 html table 的所有行插入数据库 table.
我想知道如何识别 html table 中的值以及如何将这些值插入数据库 table。谁能帮我做这个?
BEGIN
htp.p('
<HTML>
<HEAD>
<TITLE>Organization Records</TITLE>
</HEAD>
<BODY>
<H1>Organization Records</H1>
<TABLE id="DataForm" BORDER="1 " style="border-collapse: collapse; width="100%">
<TR style="width=50%">
<TH>Hierarchy</TH>
<TH>Org Long Name</TH>
</TR>
<TR style="width=50%">
<TH><input type="text"/></TH>
<TH>
<select id="S1" name="S1">
<option value="id1">data1</option>
<option value="id2">data2</option>
<option value="id3">data3</option>
</select>
</TH>
</TR>
</TABLE>
<button type="button" onclick="addRow()">Add</button>
</BODY>
</HTML>
'); 结束;
您需要在提交第 2 页时捕获这些值,因为在您提交第 4 页时它们已不存在于 HTML 中。
将 select
的 name
属性更改为 APEX 允许的属性 - 即 "f01"、"f02"、...、"f50" 之一. (有关详细信息,请参阅 docs。)
提交页面后,APEX 将填充相应的数组,例如apex_application.g_f01
、apex_application.g_f02
等
所以你需要做的就是循环遍历相关数组以获取值并将它们插入你的 table:
for i in 1..apex_application.g_f01.count loop
insert into mytable (value) values (apex_application.g_f01(i));
end loop;
真不明白你为什么掉进自己写的圈套HTML。你是在伤害自己,对 APEX 是一种伤害。
根据您提供的内容,您已经证明 plsql 块根本没有用,也不需要生成您自己的 HTML。您甚至 运行 遇到必须将项目从页面映射到后端的问题。
我会更进一步说,你所发布的内容将在你的页面中创建完全无效的 HTML,它起作用的唯一原因是因为你的浏览器(可能不是目标受众的浏览器)是如此宽容无论如何解析它。 (标签 HTML 是一个根标签,只能出现一次。所以这里你在 HTML 文档中堆叠了一个 HTML 文档。检查你的页面源和 运行通过验证器)。
为什么,或者是什么原因,您不必将经典报告与 apex_item api 结合起来使用这种久经考验的方法?或者,为什么不使用可以提供验证和每行处理的表格形式呢?两种方式都是声明式的并且速度很快。
使用经典报告,我只需要一个经典报告区域和一些 SQL,我会更快地发布您在此处编写的相同内容。
select apex_item.text(p_idx => 1, p_value => text_value) hierarchy
, apex_item.select_list_from_query(p_idx => 2, p_value => org_id, p_query => 'select dname, depto from dept') org_name
from my_table
如果使用表格形式,它会更短,因为我不必列出 html。 (并考虑 apex 5.1 的交互式网格...)
此外,您可能需要考虑使用 apex_collection 将您的数据映射到,因为这是一个向导。如果不这样做,您将把数据直接映射到表中,这在向导中通常不是所需的方法。此外,如果发生处理或验证错误怎么办?在表格表单中输入的数据(自行创建或以其他方式)不会在错误时存储,导致表单在重新呈现页面时变为 cleared/reset。
除非你有一个非常好的理由在 apex 中生成你自己的自定义 html,它不能在模板(页面、区域、报告、html 表达式)中捕获,否则不要去做吧。考虑两次。
我也在做一个自定义表单,在组合查询中,表格形式是没有用的,所以你必须自己写一个过程。
正如 Tony 所说,您可以在 apex_application.g_f01
到 apex_application.g_f50
数组中设置值,这些值可以在 p_idx
参数中设置。
例如:APEX_ITEM.HIDDEN(1,empno)
另请参阅(在隐藏示例中解释得更详细):https://docs.oracle.com/cd/E14373_01/apirefs.32/e13369/apex_item.htm#AEAPI196