Выполнить SQL-запрос в другом запросе как результат - PullRequest
2 голосов
/ 27 июня 2019

У меня есть таблица, которая содержит SQL-запрос в качестве одного из столбцов. Основываясь на идентификаторе записи, я хочу выполнить запрос SQL, который находится в записи.

Master_Table
------------------------------
|Rec_ID | Query              |
------------------------------
|1      | SELECT * from EMP  |
------------------------------
|2      | SELECT * FROM DEPT |
------------------------------
SELECT Query FROM Master_Table WHERE Rec_ID=1

Я ожидаю, что если я выберу Rec_Id = 1, мне придется EMP записи. Если я выберу Rec_Id = 2, мне нужно получить Dept records.

Возможно ли это сделать в SQL-запросе?

Ответы [ 3 ]

1 голос
/ 28 июня 2019

Существует несколько способов запуска динамического SQL в SQL.В 18c мы можем использовать полиморфную табличную функцию.Если все в порядке, чтобы получить результаты в виде XML, мы можем использовать DBMS_XMLGEN.getXML.Если мы можем создавать собственные объекты PL / SQL, мы можем использовать картридж данных Oracle для создания решения Method4 .

Например, после установки Method4 мы можем запустить SQL следующим образом:

select * from table(method4.dynamic_query(
    '
        select query
        from master_table
        where rec_id = 1
    '
));

Приведенный выше код будет работать с приведенной ниже примерной схемой:

create table master_table as
select 1 rec_id, 'SELECT * from EMP'  query from dual union all
select 2 rec_id, 'SELECT * FROM DEPT' query from dual;

create table emp(emp_name varchar2(100));
create table dept(dept_name varchar2(100));

Предыдущая информация буквально отвечает на ваш вопрос.Но я согласен с Марком Д. Пауэллом в том, что этот дизайн часто является плохой идеей, и мы должны создавать такой код только после того, как оценим альтернативные проекты.

0 голосов
/ 27 июня 2019

Вы можете использовать sys_refcursor

SQL> create or replace function get_emp_tab return sys_refcursor is
  v_rc  sys_refcursor;
  v_sql varchar2(4000);
begin
  select query into v_sql from Master_Table where Rec_ID = 1
  open v_rc for v_sql;
  return v_rc;
end;
/
SQL> declare
       v_rc sys_refcursor;
begin
   :v_rc := get_emp_tab;
end;
/
SQL> print v_rc;
0 голосов
/ 27 июня 2019

Vsau, я согласен с JNevill в том, что вам нужен PL / SQL для выполнения SQL из столбца таблицы.Также я добавлю, что подобные дизайны обычно плохая идея.Вы хотите, чтобы SQL вашего приложения был статическим SQL с использованием переменных связывания, в противном случае ваша система будет страдать от слишком большого процента жестких синтаксических разборов и, как следствие, от конфликта на объектах словаря, и вы можете столкнуться с проблемами фрагментации общего пула.

...