如何从插件SQL源代码中的Region Source SQL Select语句获取结果表?

时间:2018-09-07 13:18:15

标签: plsql oracle-apex oracle-apex-5.1

我目前正在为地区开发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; 

“实际测试表” SELECT返回此t1表:

|ORIGIN|'a'|'b'|
|------|---|---|
| a    | 11| 21|
| b    | 12| 22|

console.log打印如下字符串:[[11,21],[12,22]]。而且,如果我进行了一些调整,则该插件甚至应在浏览器控制台中以JS数组的形式返回此JS Array。

这些是必需的,并且暂时没有正确的结果。 但是,如果我将“实际测试表” SELECT更改为p_region.source,并将此SELECT放在Source: SQL Query的{​​{1}}中,根本不起作用,并且由于某些错误,Page Designer不想保存此插件。

APEX应该能够使用任何p_region.source,甚至可以使用SELECT之类的简单对象,其中SELECT * FROM table_A是类似于“实际测试表” {{ 1}}。

问题::如何正确引用table_A中的查询结果以使其全部正常工作? AFAIK,可以使用t1p_region.source完成。但是我不知道它会返回什么以及如何以及在哪里进行测试。我想在dbfiddle之类的工具中玩它,以了解它的作用。

PS:我是一名初中生,但是不管我的资历如何,老板都给了我这项任务。同样,Oracle Documentation在这种情况下不是很有帮助。

1 个答案:

答案 0 :(得分:4)

首先,什么将总体上帮助您发展。在开发区域插件时,有两种查看调试信息的方法:将常规数据记录到表中或直接在页面上输出。对于第一种方法(登录到表),您需要创建一个表(具有所需的任何结构),并从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返回类型为apex_plugin_util.t_column_value_list的值,它只是字符串集合的集合。必须使用此函数的主要原因是它还可以绑定SQL代码中的任何绑定变量。例如,如果您有一个页面项目P1_VALUE,并且想在查询中使用其值,则可以输入区域的来源:

select *
  from table
 where column1 = :P1_VALUE

APEX_PLUGIN_UTIL.GET_DATA将在此处自动绑定项目的值。

如何处理结果。以下代码将输出一个简单的html表:

  ...
  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;

请注意,此函数返回(出于某种原因)已转置的表。因此,如果您有一个包含两列三行的表:

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>