如何从区域源 SQL Select 插件 SQL 源代码中的语句获取结果 table?
How to get result table from Region Source SQL Select Statement in Plugin SQL Source Code?
我目前正在为区域开发一个 APEX 插件。它执行一些 JavaScript 代码,并将 SELECT
结果转换为字符串。但出于测试原因,SELECT
查询暂时写入插件的源 PL/SQL 代码中。
源代码如下所示:
FUNCTION f_render (p_region in apex_plugin.t_region, p_plugin in apex_plugin.t_plugin)
RETURN apex_plugin.t_region_render_result IS
v_js VARCHAR(512);
v_data VARCHAR(1024);
BEGIN
SELECT '[' || c_matrix || ']' INTO v_data FROM (
SELECT listagg(c_row, ',') WITHIN GROUP (ORDER BY c_row) AS c_matrix FROM (
-- next line should be re-written
-- for compatibility with any possible origin or target string
-- values and numbers, but it's another question
SELECT '[' || "'a'" || ',' || "'b'" || ']' AS c_row FROM (
-- actual test table query that should be in p_region.source
WITH t0 AS (
SELECT 'a' origin, 'a' target, 11 amount FROM dual UNION ALL
SELECT 'a', 'b', 21 FROM dual UNION ALL
SELECT 'b', 'a', 12 FROM dual UNION ALL
SELECT 'b', 'b', 22 FROM dual
), t1 AS (
SELECT * FROM t0
PIVOT ( sum(amount) for target in ('a','b'))
ORDER BY origin
)
SELECT * FROM t1
)
)
);
v_js := q'[
console.log("@DATASTRING@");
]';
v_js := REPLACE(v_js, '@DATASTRING@', v_data);
apex_javascript.add_onload_code(p_code => v_js, p_key => null);
RETURN NULL;
END f_render;
本"actual test table"SELECT
returns本t1
table:
|ORIGIN|'a'|'b'|
|------|---|---|
| a | 11| 21|
| b | 12| 22|
console.log
打印如下字符串:[[11,21],[12,22]]
。而且,如果我调整一些东西,这个插件甚至 returns 浏览器控制台中的这个 JS 数组作为......一个 JS 数组,它应该。
这些是目前必需的正确结果。 但是 如果我将 "actual test table" SELECT
更改为 p_region.source
并将此 SELECT
放入 Source: SQL Query
中 Page Designer
, 它根本不起作用,并且 APEX
由于某些错误不想保存此插件。
p_region.source
应该可以使用任何 SELECT
,甚至像 SELECT * FROM table_A
这样简单的东西,其中 table_A
是一个类似于 "actual test table" 的旋转矩阵t1
。
问题: 如何正确引用 p_region.source
中的查询结果以使其全部正常工作? AFAIK,可以用 APEX_PLUGIN_UTIL.GET_DATA
或 .GET_DATA2
来完成。但我不知道它 returns 是什么以及如何以及在哪里测试它。我想在 dbfiddle 之类的东西中使用它来了解它的作用。
PS:我是一个前端小白,但是我的老板不管我的资质如何,都把这个任务交给了我。 Oracle 文档在这种情况下也不是很有帮助。
首先,一般情况下什么会帮助你发展。在开发 Region Plug-in 时,有两种方法可以查看调试信息:通常的数据记录到 table 或直接在页面上输出。对于第一种方式(登录到 table),您需要创建一个 table(具有您需要的任何结构)并从您的 PL/SQL 代码中插入行。第二种方式使用htp.p
程序直接在网页中输出数据。例如,如果将以下代码放入渲染插件函数中:
select some_value
into v_variable
from table1
where ... ;
htp.p('Variable contains: ' || v_variable || '<br />');
此代码将创建如下内容:
<div> <!-- open and close div tags are generated by APEX engine -->
Variable contains: 123<br />
</div>
您需要创建一个页面,创建一个带有您的插件类型的区域,然后在浏览器中打开该页面。之后你会看到输出。
接下来,如何处理SQL查询。 APEX_PLUGIN_UTIL.GET_DATA
returns 类型为 apex_plugin_util.t_column_value_list
的值,它只是字符串集合的集合。你必须使用这个函数的主要原因是它还可以绑定SQL代码中的任何绑定变量。例如,如果您有一个页面项目 P1_VALUE
并且想在查询中使用它的值,您可以输入区域的来源:
select *
from table
where column1 = :P1_VALUE
APEX_PLUGIN_UTIL.GET_DATA
会在此处自动绑定一个项目的值。
如何处理结果。下面的代码会输出一个简单的 html table:
...
v_data apex_plugin_util.t_column_value_list;
begin
...
v_data := apex_plugin_util.get_data(p_region.source, 1, 10, p_region.name);
htp.p('<table><tbody>');
for i in v_data.first .. v_data.last loop
htp.p('<tr>');
for j in v_data(i).first .. v_data(i).last loop
-- your code to process data
htp.p('<td>' || v_data(i)(j) || '</td>');
end loop;
htp.p('</tr>');
end loop;
htp.p('</tbody></table>');
...
end;
请注意,此函数 returns(出于某种原因)转置 table。因此,如果您有一个包含两列和三行的 table:
COL1 COL2
----------
abc 123
def 456
ghi 789
以上代码的输出将是:
<table>
<tbody>
<tr>
<td>abc</td><td>def</td><td>ghi</td>
</tr>
<tr>
<td>123</td><td>456</td><td>789</td>
</tr>
</tbody>
</table>
我目前正在为区域开发一个 APEX 插件。它执行一些 JavaScript 代码,并将 SELECT
结果转换为字符串。但出于测试原因,SELECT
查询暂时写入插件的源 PL/SQL 代码中。
源代码如下所示:
FUNCTION f_render (p_region in apex_plugin.t_region, p_plugin in apex_plugin.t_plugin)
RETURN apex_plugin.t_region_render_result IS
v_js VARCHAR(512);
v_data VARCHAR(1024);
BEGIN
SELECT '[' || c_matrix || ']' INTO v_data FROM (
SELECT listagg(c_row, ',') WITHIN GROUP (ORDER BY c_row) AS c_matrix FROM (
-- next line should be re-written
-- for compatibility with any possible origin or target string
-- values and numbers, but it's another question
SELECT '[' || "'a'" || ',' || "'b'" || ']' AS c_row FROM (
-- actual test table query that should be in p_region.source
WITH t0 AS (
SELECT 'a' origin, 'a' target, 11 amount FROM dual UNION ALL
SELECT 'a', 'b', 21 FROM dual UNION ALL
SELECT 'b', 'a', 12 FROM dual UNION ALL
SELECT 'b', 'b', 22 FROM dual
), t1 AS (
SELECT * FROM t0
PIVOT ( sum(amount) for target in ('a','b'))
ORDER BY origin
)
SELECT * FROM t1
)
)
);
v_js := q'[
console.log("@DATASTRING@");
]';
v_js := REPLACE(v_js, '@DATASTRING@', v_data);
apex_javascript.add_onload_code(p_code => v_js, p_key => null);
RETURN NULL;
END f_render;
本"actual test table"SELECT
returns本t1
table:
|ORIGIN|'a'|'b'|
|------|---|---|
| a | 11| 21|
| b | 12| 22|
console.log
打印如下字符串:[[11,21],[12,22]]
。而且,如果我调整一些东西,这个插件甚至 returns 浏览器控制台中的这个 JS 数组作为......一个 JS 数组,它应该。
这些是目前必需的正确结果。 但是 如果我将 "actual test table" SELECT
更改为 p_region.source
并将此 SELECT
放入 Source: SQL Query
中 Page Designer
, 它根本不起作用,并且 APEX
由于某些错误不想保存此插件。
p_region.source
应该可以使用任何 SELECT
,甚至像 SELECT * FROM table_A
这样简单的东西,其中 table_A
是一个类似于 "actual test table" 的旋转矩阵t1
。
问题: 如何正确引用 p_region.source
中的查询结果以使其全部正常工作? AFAIK,可以用 APEX_PLUGIN_UTIL.GET_DATA
或 .GET_DATA2
来完成。但我不知道它 returns 是什么以及如何以及在哪里测试它。我想在 dbfiddle 之类的东西中使用它来了解它的作用。
PS:我是一个前端小白,但是我的老板不管我的资质如何,都把这个任务交给了我。 Oracle 文档在这种情况下也不是很有帮助。
首先,一般情况下什么会帮助你发展。在开发 Region Plug-in 时,有两种方法可以查看调试信息:通常的数据记录到 table 或直接在页面上输出。对于第一种方式(登录到 table),您需要创建一个 table(具有您需要的任何结构)并从您的 PL/SQL 代码中插入行。第二种方式使用htp.p
程序直接在网页中输出数据。例如,如果将以下代码放入渲染插件函数中:
select some_value
into v_variable
from table1
where ... ;
htp.p('Variable contains: ' || v_variable || '<br />');
此代码将创建如下内容:
<div> <!-- open and close div tags are generated by APEX engine -->
Variable contains: 123<br />
</div>
您需要创建一个页面,创建一个带有您的插件类型的区域,然后在浏览器中打开该页面。之后你会看到输出。
接下来,如何处理SQL查询。 APEX_PLUGIN_UTIL.GET_DATA
returns 类型为 apex_plugin_util.t_column_value_list
的值,它只是字符串集合的集合。你必须使用这个函数的主要原因是它还可以绑定SQL代码中的任何绑定变量。例如,如果您有一个页面项目 P1_VALUE
并且想在查询中使用它的值,您可以输入区域的来源:
select *
from table
where column1 = :P1_VALUE
APEX_PLUGIN_UTIL.GET_DATA
会在此处自动绑定一个项目的值。
如何处理结果。下面的代码会输出一个简单的 html table:
...
v_data apex_plugin_util.t_column_value_list;
begin
...
v_data := apex_plugin_util.get_data(p_region.source, 1, 10, p_region.name);
htp.p('<table><tbody>');
for i in v_data.first .. v_data.last loop
htp.p('<tr>');
for j in v_data(i).first .. v_data(i).last loop
-- your code to process data
htp.p('<td>' || v_data(i)(j) || '</td>');
end loop;
htp.p('</tr>');
end loop;
htp.p('</tbody></table>');
...
end;
请注意,此函数 returns(出于某种原因)转置 table。因此,如果您有一个包含两列和三行的 table:
COL1 COL2
----------
abc 123
def 456
ghi 789
以上代码的输出将是:
<table>
<tbody>
<tr>
<td>abc</td><td>def</td><td>ghi</td>
</tr>
<tr>
<td>123</td><td>456</td><td>789</td>
</tr>
</tbody>
</table>