2017-01-05 3 views
0

То, что я пытаюсь сделать, по существу, это:UNION на динамических операторов SQL

SELECT 1 FROM DUAL 
UNION 
EXECUTE IMMEDIATE 'SELECT 2 FROM dual'; 

Я на самом деле тестирующий пытается обойти брандмауэр веб-приложений, так что я уверен, что это выглядит глупо/странно из другая сторона. В принципе, мне нужно иметь возможность делать UNION с динамическими запросами, чтобы обойти фильтр. Итак, в этом примере вы передаете строку из Java в Oracle DB, используя this function.

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

+0

Не можете ли вы объединить их обоих в динамический sql? – GurV

+0

Я не могу заставить динамический SQL выполнить. Приведенный выше пример - это то, что я в идеале хотел бы иметь в качестве доказательства концепции (или что-то подобное с правильным синтаксисом). Моя проблема заключается не столько в объединении, сколько в том, что мне нужно разделить строки, такие как 'UTL_HTTP' или' UTL_FILE', на что-то вроде '' UTL_ '||/* testing */'HTTP''. – Gray

+1

Это все еще не имеет смысла. 'execute instant' - это PL/SQL-конструктор, и вы пытаетесь использовать его в простом SQL. Даже если весь объединенный оператор в конечном счете выполняется динамически, это происходит в контексте SQL, поэтому он по-прежнему недействителен. –

ответ

2

The execute immediate statement действителен только в блоке PL/SQL. Вы не можете смешивать его с обычным SQL. Вы можете запускать (только) PL/SQL динамически, но опять же не смешивать два в одном из операторов, как вы пробовали.

Если вы бежите, что вы показали в обычном клиенте вы увидите, он жалуется:

Error starting at line : 1 in command - 
SELECT 1 FROM DUAL 
UNION 
EXECUTE IMMEDIATE 'SELECT 2 FROM dual' 
Error at Command Line : 3 Column : 1 
Error report - 
SQL Error: ORA-00928: missing SELECT keyword 
00928. 00000 - "missing SELECT keyword" 
*Cause:  
*Action: 

Даже если заявление вы передаете сама выполняется динамически, то вы увидели бы ту же ошибку:

BEGIN 
    EXECUTE IMMEDIATE q'[SELECT 1 FROM DUAL 
UNION 
EXECUTE IMMEDIATE 'SELECT 2 FROM dual']'; 
END; 
/

Error report - 
ORA-00928: missing SELECT keyword 
ORA-06512: at line 2 
00928. 00000 - "missing SELECT keyword" 

дальнейшее рассмотрение, хотя это немного спорный вопрос здесь, является то, что динамический запрос фактически не выполняется, если вы не потребляя результаты, выбрав в переменную (see the note here.

+0

Это очень полезно для просмотра. Спасибо. Я открыт для таких функций, как создание функций (состоящих из динамического SQL). Я просто хочу свести к минимуму следы/очистку. Если есть альтернативы EXECUTE IMMEDIATE в простом SQL. Что-то вроде команды «eval» ... это было бы очень полезно. В противном случае существует ли способ создать псевдоним для команды динамически? Я знаю, что мой вопрос немного повсюду, но правда в том, что я действительно не знаю, о чем просить. Мне нужно иметь возможность вводить слова *, например * 'UTL_FILE', не отправляя их на сервер в целом. – Gray

+1

[12c позволяет объявлять функции в запросе] (https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF55665), хотя я еще не пробовал это; но CTE определяется перед 'select', поэтому я не думаю, что это вам тоже поможет. Если все, что вы можете сделать, это заменить ваши значения '', тогда я изо всех сил пытаюсь увидеть какой-либо систематический способ сделать что-нибудь неприятное. Я не уверен, что союз будет даже полезен, даже если он не был каким-то образом заблокирован, до 12c. (В 11g вы не можете использовать CTE в ветке объединения, так как не уверены в 12c). –

+0

В принципе, вы ничего не можете сделать динамически из SQL. Я не уверен, что 'UTL_FILE' блокируется как таковой или вы просто пытаетесь вызвать процедуру из запроса или функцию, которая не разрешена, - если вы не видите ошибку, это может быть больше как вы думаете. Или пользователь, с которым вы подключены, так как его привилегии были отключены, поэтому он даже не может попытаться выполнить пакеты, которые вы пытаетесь использовать. –