Динамический SQL (EXECUTE) как условие для оператора IF - PullRequest
11 голосов
/ 09 декабря 2011

Я хочу выполнить динамический оператор SQL, возвращаемое значение которого является условным для оператора IF:

IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN

Это приводит к ошибке ERROR: type "execute" does not exist.

Возможно ли это сделать или необходимо выполнить SQL перед оператором IF в переменную, а затем проверить переменную как условную?

Ответы [ 3 ]

20 голосов
/ 09 декабря 2011

Эта конструкция невозможна:

IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...

Вы можете упростить до:

IF EXISTS (SELECT 1 FROM mytable) THEN ...

Но ваш пример, вероятно, простоупрощена.Для динамический SQL , выполненный с EXECUTE, , прочтите руководство здесь .Вы можете проверить FOUND после RETURN QUERY EXECUTE:

IF FOUND THEN ...

Однако:

В частности, обратите внимание, что EXECUTE изменяет вывод GET DIAGNOSTICS, но не меняется FOUND.

Жирный акцент мой.Для простого EXECUTE сделайте это вместо:

...
DECLARE
   i int;
BEGIN
   EXECUTE 'SELECT 1 FROM mytable';

   GET DIAGNOSTICS i = ROW_COUNT;

   IF i > 0 THEN ...

или , если это уместно - в частности, только с результатами из одной строки - используйте INTO предложение с EXECUTE для непосредственного получения результата динамического запроса.Я цитирую руководство здесь :

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

...
DECLARE
   _var1 int;  -- init value is NULL unless instructed otherwise
BEGIN

EXECUTE format('SELECT var1 FROM %I WHERE x=y LIMIT 1', 'my_Table')
INTO    _var1;

IF _var1 IS NOT NULL THEN ...
7 голосов
/ 09 декабря 2011

Matt,

Из приведенного выше синтаксиса вы пишете PL / pgSQL, а не SQL.Исходя из этого, есть два способа сделать то, что вы хотите, но для обоих потребуется две строки кода:

EXECUTE 'SELECT EXISTS (SELECT 1 FROM ' || table_variable || ' );' INTO boolean_var;

IF boolean_var THEN ...

Или:

EXECUTE 'SELECT 1 FROM ' || table_variable || ' );';

IF FOUND THEN ...

«FOUND» - специальная переменнаякоторый проверяет, вернул ли последний запрос какие-либо строки.

0 голосов
/ 09 июня 2015
SET @SQLQUERY='SELECT 1 FROM mytable'

EXEC (@SQLQUERY)
If @@RowCount >0  THEN
...