【问题标题】:How to get result table from Region Source SQL Select Statement in Plugin SQL Source Code?如何从插件 SQL 源代码中的 Region Source SQL Select 语句获取结果表?
【发布时间】:2019-02-12 20:36:44
【问题描述】:

我目前正在为区域开发一个 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 数组,因为它应该。

目前这些是必需且正确的结果。 但是如果我将“实际测试表”SELECT 更改为p_region.source 并将此SELECT 放入Source: SQL Query 放入Page Designer,它根本不起作用,而APEX由于某些错误,不想保存此插件。

p_region.source 应该能够使用任何SELECT,甚至像SELECT * FROM table_A 这样简单的东西,其中table_A 是类似于“实际测试表”t1 的旋转矩阵。

问题:如何正确引用p_region.source 中的查询结果以使其正常工作? AFAIK,它可以用APEX_PLUGIN_UTIL.GET_DATA.GET_DATA2 完成。但我不知道它返回什么以及如何以及在哪里测试它。我想在 dbfiddle 之类的东西中使用它来了解它的作用。

PS:我是一名前端初级,但是我的老板不管我的资格如何都给了我这个任务。在这种情况下,Oracle 文档也不是很有帮助。

【问题讨论】:

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


    【解决方案1】:

    首先,总体上什么会帮助你发展。在开发 Region Plug-in 时,有两种查看调试信息的方法:将常规数据记录到表中或直接在页面上输出。对于第一种方式(登录到表),您需要创建一个表(具有您需要的任何结构)并从您的 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多