Как получить таблицу результатов из Region Source SQL Select Statement в плагине SQL Source Code? - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я разрабатываю плагин 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 Documentation не очень помогает в этой ситуации.

1 Ответ

0 голосов
/ 11 сентября 2018

Прежде всего, что поможет вам развиваться в целом. Когда вы разрабатываете плагин Region, существует два способа просмотра отладочной информации: обычные данные, записываемые в таблицу, или вывод непосредственно на страницу. Для первого способа (вход в таблицу) вам нужно создать таблицу (с любой необходимой вам структурой) и вставить туда строки из вашего кода 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>
...