Выполнить запрос с переменной как подзапрос

У меня есть такой запрос:

select * from SOURCE
where A = 'a'
and B in (
  select SOMECOLUMN from VERY_LONG_QUERY 
  WHERE SOMECHECK = 'some check'
)

Я хотел бы преобразовать приведенный выше запрос в оператор PL/SQL следующим образом:


veryLongQueryVar := 'select SOMECOLUMN from VERY_LONG_QUERY WHERE SOMECHECK = ''some check'' ' 

select * from SOURCE
where A = 'a'
and B in veryLongQueryVar

Как это возможно?

что вы ожидаете, делая это?

hotfix 22.05.2019 11:07

Зачем вам это нужно? Вы смотрите на динамический sql, если часть запроса необходимо генерировать на лету. В общем, статический sql лучше (более удобен в сопровождении, менее подвержен SQL-инъекциям и т. д.).

Boneist 22.05.2019 11:08

Это звучит как динамический SQL, и вы должны использовать execute immediate. Тоже не очень хорошая идея. Вероятно, вы пытаетесь решить не ту проблему.

Gordon Linoff 22.05.2019 13:20

Моя идея заключалась в том, чтобы разделить 2 запроса, чтобы они были более понятными и читабельными для других разработчиков. Кроме того, я сделал пример только с одним подзапросом, но в моем реальном случае у меня есть 3 вложенных запроса.

gixlg 23.05.2019 10:52
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
4
496
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот предложение, что вы можете сделать.

Вы сохраняете значения из длинного запроса в коллекции и используете их в другом выборе.

declare
  TYPE my_collection IS TABLE OF SOMECOLUMN%type
      INDEX BY number;
  tab my_collection ;
  rec SOURCE%rowtype;
begin
  select SOMECOLUMN 
  bulk collect into tab 
  from VERY_LONG_QUERY 
  WHERE SOMECHECK = 'some check';


  select * into rec 
    from SOURCE
   where A = 'a'
     and B in (select column_value from table(tab);
end; 

вы также можете создать динамическую строку SQL.

declare
  TYPE cur IS REF CURSOR;
  my_cur   cur;
  veryLongQueryVar  varchar2(32000);
begin
  veryLongQueryVar := 'select SOMECOLUMN from VERY_LONG_QUERY WHERE SOMECHECK = ''some check'' ' 

  veryLongQueryVar  := 'select * from SOURCE
                        where A = ''a''
                        and B in ('||veryLongQueryVar ||')'

  open my_cur for veryLongQueryVar  ;
  ....

end;

Я получил эту ошибку: PLS-00103: Encountered the symbol "OPEN" when expecting one of the following: * & = - + ; < / > at in is mod remainder not rem <an exponent (**)> <> or != or ~= >= <= <> and or like like2 like4 likec between || multiset member submultiset 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error.

gixlg 23.05.2019 11:18
Ответ принят как подходящий

Вы можете добиться чего-то подобного с WITH пункт:

with veryLongQueryVar as
 (select SOMECOLUMN from VERY_LONG_QUERY WHERE SOMECHECK = 'some check')
select * from SOURCE
where A = 'a'
 and B in (select SOMECOLUMN from veryLongQueryVar)

Вы также можете использовать SELECT INTO, чтобы выбрать очень длинные результаты запроса в переменную (типа таблицы чего-либо) и используйте table, чтобы передать его в IN. Но это приведет к двум отдельным запросам, и, похоже, вы хотите этого избежать.

Другие вопросы по теме