powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как выполнить динамический SELECT внутри функции ?
6 сообщений из 6, страница 1 из 1
Как выполнить динамический SELECT внутри функции ?
    #40035941
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
...
EXECUTE format('SELECT ST_X(ST_Transform(ST_GeomFromEWKT(%s), %s))', 'SRID=4326;POINT(0 0)', srid) INTO coord;
...
SQL Error [42601]: ОШИБКА: ошибка синтаксиса (примерное положение: ";")


В справке рассматриваются только 2 варианта выполнения SELECT:
1) Статический SELECT-запрос
2) Динамический SELECT-запрос с плейсхолдерами ($1, $2) и USING

В моём случае запрос динамический, но без плейсхолдеров ($1, $2) и без USING...
Результат выполнения запроса нужно присвоить переменной coord .
...
Рейтинг: 0 / 0
Как выполнить динамический SELECT внутри функции ?
    #40035945
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чёрт блин, это он не на EXECUTE ругался, а на ";" в строке 'SRID=4326;POINT(0 0)':
Код: sql
1.
EXECUTE format('SELECT ST_X(ST_Transform(ST_GeomFromEWKT(''%s\''), %s))', 'SRID=4326;POINT(0 0)', srid) INTO coord;
...
Рейтинг: 0 / 0
Как выполнить динамический SELECT внутри функции ?
    #40035958
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

Да какой же у вас без placeholders если их у вас там два.... и вы как раз и получаете проблемы из за того что не хотите их использовать
а извращаетесь с format (чего делать вместо USING 100% не стоит)

'SRID=4326;POINT(0 0)', srid - это и есть placeholders у вас...

Код: plsql
1.
EXECUTE 'SELECT ST_X(ST_Transform(ST_GeomFromEWKT($1), $2))' INTO coord USING 'SRID=4326;POINT(0 0)', srid; 



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Как выполнить динамический SELECT внутри функции ?
    #40036002
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukДа какой же у вас без placeholders если их у вас там два....> В моём случае запрос динамический, но без плейсхолдеров ($1, $2) и...
Т.е. в моём примере нет плейсхолдеров, используемых командой EXECUTE (но можно их ввести, как вы показали в вашем примере).

Maxim Bogukи вы как раз и получаете проблемы из за того что не хотите их использовать
а извращаетесь с format (чего делать вместо USING 100% не стоит)
Код: sql
1.
EXECUTE 'SELECT ST_X(ST_Transform(ST_GeomFromEWKT($1), $2))' INTO coord USING 'SRID=4326;POINT(0 0)', srid; 

Да, так проще. Но только в данном примере.
Если подставляются имена таблиц, полей и прочих объектов БД, то такой вариант работать не будет.

У меня практически все динамические запросы с подстановкой имён полей и таблиц - там без format не обойтись. Поэтому и здесь по привычке через format начал писать...

P.S . Можно час сидеть копаться с какой-то проблемой из-за какого-нибудь таракана.
Но как только напишешь на форуме, сразу находишь решение. Вот если бы наоборот...
...
Рейтинг: 0 / 0
Как выполнить динамический SELECT внутри функции ?
    #40036040
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

авторЕсли подставляются имена таблиц, полей и прочих объектов БД, то такой вариант работать не будет.

вот их и надо подставлять (очень аккуратно чтобы sql injection не наловить) через format
а параметры/значения должны ВСЕГДА подставляться через USING

т.е. вполне может быть execute с format и с using одновременно и это правильно если задача требует.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Как выполнить динамический SELECT внутри функции ?
    #40036095
комит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как переменную еще объявить можно и динамически собрать
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как выполнить динамический SELECT внутри функции ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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