Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как выполнить динамический SELECT внутри функции ? / 6 сообщений из 6, страница 1 из 1
14.01.2021, 20:08
    #40035941
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выполнить динамический SELECT внутри функции ?
Код: 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
14.01.2021, 20:21
    #40035945
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выполнить динамический SELECT внутри функции ?
Чёрт блин, это он не на 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
14.01.2021, 20:56
    #40035958
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выполнить динамический SELECT внутри функции ?
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
15.01.2021, 01:53
    #40036002
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выполнить динамический SELECT внутри функции ?
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
15.01.2021, 10:37
    #40036040
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выполнить динамический SELECT внутри функции ?
Cyrax_02,

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

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

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


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


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