Мне нужна помощь с использованием динамического SQL в табличной функции - PullRequest
0 голосов
/ 26 декабря 2018

Я работаю со сторонним приложением с оракулом.

Я пытаюсь сохранить SQL, который затем будет передан в базу данных, и отобразить список результатов.

Проблема в том, что когда приложение запрашивает БД, оно превращает все одинарные кавычки в двойные одинарные кавычки.(выберите «x» из «dual», выберите «« x »» из «dual»). Итак, я подумал, что мог бы создать табличную функцию, которая бы удаляла лишние одинарные кавычки и выполняла запрос, но у меня проблемы.

create or replace type DSQLMenu_Record as object 
(
  label varchar2(255),
  value varchar2(255)
)
;--------------------------------------------------------------------
create or replace type DSQLMenu_Table as table of DSQLMenu_Record
;--------------------------------------------------------------------
create or replace function F_DSQLMenu (V_IN_QUERY in varchar2)
return DSQLMenu_Table as
    V_RESULTS        DSQLMenu_Table;
    V_PARSED_QUERY   VARCHAR2(8000);
begin
    V_PARSED_QUERY := replace(V_IN_QUERY,'''''','''') ;
    select 
      DSQLMenu_Record(label, value)
      bulk collect into
      V_RESULTS
      from 
          (
             execute immediate V_PARSED_QUERY;
          );
     return V_RESULTS;
end F_DSQLMenu;

Если бы он делал то, что хотел бы, пользователь щелкнул бы раскрывающееся меню в приложении и увидел бы список результатов на основе запроса sql, который был передан.

Благодаря.

1 Ответ

0 голосов
/ 27 декабря 2018

Спасибо за предоставленную дополнительную информацию.Я думаю, что вам нужно немного изменить свой выбор .....

см. https://docs.oracle.com/cd/B12037_01/appdev.101/b10807/11_dynam.htm для правильного синтаксиса.

Так что это должно быть что-то вроде строкииз нижеприведенного (нет среды для тестирования)

V_PARSED_QUERY := 'select DSQLMenu_record(label, value) from (' || v_parsed_query || ')';
execute immediate v_parsed_query bulk collect into v_results;

ОБНОВЛЕНИЕ

в ответ на ваш комментарий .... Я не уверен, почему вы быполучать одну запись.Согласно приведенному ниже фрагменту кода, я получаю две записи правильно

declare

type DSQLMenu_Table is table of DSQLMenu_Record;

V_RESULTS        DSQLMenu_Table;
V_PARSED_QUERY   VARCHAR2(8000) := 'select ''The Test Value A'' thelabel, ''TestValA'' thevalue, 1 thesort from dual union select ''The Test Value B'' thelabel, ''TestValB'' thevalue, 2 thesort from dual order by thesort';

begin
V_PARSED_QUERY := 'select DSQLMenu_Record(thelabel, thevalue) from (' || v_parsed_query || ')';
dbms_output.put_line(v_parsed_query);

execute immediate v_parsed_query bulk collect into v_results;

dbms_output.put_line(v_results.count);

for i in v_results.first..v_results.last loop
   dbms_output.put_line(v_results(i).label);
end loop;

end;

результат вывода в дБмс

    select DSQLMenu_Record(thelabel, thevalue) from (select 'The Test Value A' thelabel, 'TestValA' thevalue, 1 thesort from dual union select 'The Test Value B' thelabel, 'TestValB' thevalue, 2 thesort from dual order by thesort)
2
The Test Value A
The Test Value B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...