powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Динамический SQL - if ... then ... else
6 сообщений из 6, страница 1 из 1
Динамический SQL - if ... then ... else
    #33594735
Alexander Wasiljev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Ребята, помогите плиз!
Вот на такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
sql := 'IF tmp_rec.' || remote_field 
	|| ' is NULL '
	|| 'THEN '
	|| 'ret := 0; '
	|| 'ELSE '
	|| 'ret := 1; '
	|| 'END IF;';
EXECUTE sql;

получаю ошибку
Код: plaintext
1.
ERROR:  syntax error at or near "IF" at character  1 
QUERY:  IF tmp_rec."R_USERNAME" is NULL THEN ret :=  0 ; ELSE ret :=  1 ; END IF;

причем непосредственная вставка в хп вместо execute строки
Код: plaintext
IF tmp_rec."R_USERNAME" = '' THEN ret :=  0 ; ELSE ret :=  1 ; END IF;
проходит на ура...
...
Рейтинг: 0 / 0
Динамический SQL - if ... then ... else
    #33594849
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
execute выполняет SQL а не plpgsql. То, что ты хочешь в plpgsql так не делается.
Можно взять plperl, plpython, pltcl
Или вместо if использовать case when :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
-- Для 8.1 проще:
execute 'select case when tmp_rec.' || remote_field || ' is NULL THEN 0 ELSE 1 END ' into ret;
-- Для ранних версий - длиннее
declare
   r record;
for r in execute 'select case when tmp_rec.' || remote_field || ' is NULL THEN 0 ELSE 1 END as i '
loop
   ret := t.i;
end loop;
...
Рейтинг: 0 / 0
Динамический SQL - if ... then ... else
    #33594865
Alexander Wasiljev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
...
Рейтинг: 0 / 0
Динамический SQL - if ... then ... else
    #33594936
Alexander Wasiljev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Однако я встал на другие грабли - на
Код: plaintext
EXECUTE 'select case when tmp_rec.' || remote_field || ' is NULL THEN 0 ELSE 1 END;' into ret;
получаю
Код: plaintext
ERROR:  relation "tmp_rec" does not exis

tmp_rec объявлена в DECLARE хп (как record).
Я правильно понимаю, что tmp_rec не видна в моем селекте? Как в таком случае быть?
...
Рейтинг: 0 / 0
Динамический SQL - if ... then ... else
    #33595064
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опсс... Да я слажал ;-(

Совет: когда мне нужно делать такие вещи, я плюю на plpgsql и беру plpython (plperl, если приходится что-то делать, чего plpython не может).

Теоретически (если все возможные поля известны), можно собрать требуемую запись:

Код: plaintext
1.
2.
3.
EXECUTE 
'select case when ' || remote_field || ' is NULL THEN 0 ELSE 1 END from
 select ''' || tmp_rec.a ||'''::type_a as a, ''' || tmp_rec.b || '''::type_b as b;' into ret;
...
Рейтинг: 0 / 0
Динамический SQL - if ... then ... else
    #33595137
Alexander Wasiljev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ясно, я понял.
Буду использовать plperl.

Благодарю!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Динамический SQL - if ... then ... else
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]