Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Передать значение в скрипт / 11 сообщений из 11, страница 1 из 1
24.12.2018, 11:44
    #39752109
rinace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение в скрипт
Сорри, но ситуация как с лыжами на асфальте .

Хочу передать некое(текстовое) значение в скрипт
Код: plaintext
psql -v mdbname='testdb' -f test_func.sql

Тело скрипта :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DO $$
DECLARE
   dbname varchar(63);
BEGIN
    RAISE NOTICE 'TEST';

    dbname := :'mdbname';

    RAISE NOTICE 'TEST = %', dbname;

END $$ ;

Результат :
Код: plaintext
1.
2.
3.
4.
func.sql:11: ERROR:  syntax error at or near ":"
LINE 7:     dbname := :'mdbname';
                      ^


При этом :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
[postgres@localhost stat]$ psql -v mdbname=testdb
psql (10.5)
Type "help" for help.

postgres=# \set
...
mdbname = 'testdb'
postgres=# 

Я стою на асфальте, ноги в лыжи обуты ....

Что не так ?
...
Рейтинг: 0 / 0
24.12.2018, 11:46
    #39752113
rinace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение в скрипт
Код: plaintext
1.
2.
3.
4.
[postgres@localhost stat]$ psql --set mdbname=testdb -f test_func.sql
psql:test_func.sql:11: ERROR:  syntax error at or near ":"
LINE 7:     dbname := :'mdbname';
                      ^
...
Рейтинг: 0 / 0
24.12.2018, 11:52
    #39752117
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение в скрипт
rinace,

psql намеренно не подставляет переменные в строковых литералах
Variable interpolation will not be performed within quoted SQL literals and identifiers. Therefore, a construction such as ':foo' doesn't work to produce a quoted literal from a variable's value (and it would be unsafe if it did work, since it wouldn't correctly handle quotes embedded in the value).
Dollar-quoted String Constants - это как раз строковой литерал.
...
Рейтинг: 0 / 0
24.12.2018, 11:56
    #39752124
rinace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение в скрипт
Melkijrinace,

psql намеренно не подставляет переменные в строковых литералах
Variable interpolation will not be performed within quoted SQL literals and identifiers. Therefore, a construction such as ':foo' doesn't work to produce a quoted literal from a variable's value (and it would be unsafe if it did work, since it wouldn't correctly handle quotes embedded in the value).
Dollar-quoted String Constants - это как раз строковой литерал.
Ну а как же передать строку в скрипт ?
...
Рейтинг: 0 / 0
24.12.2018, 12:26
    #39752150
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение в скрипт
rinace,

create function qqqq(zzzzzz varchar)
...
select function('dddddd');
drop function qqqq(varchar) ;

не пробовали?
...
Рейтинг: 0 / 0
24.12.2018, 12:50
    #39752168
rinace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение в скрипт
Hawkmoon,

Это на самый крайний случай. Не хотелось бы на продакшн постоянно создавать и убивать функции
...
Рейтинг: 0 / 0
24.12.2018, 13:05
    #39752179
iriswind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение в скрипт
Как вариант
psql -h 127.0.0.1 -c "`sed 's/VRBL/<value>/' er.sql`"
VRBL - это ваша переменная в sql-файле
<value> - значение, которое требуется передать
...
Рейтинг: 0 / 0
24.12.2018, 13:06
    #39752181
iriswind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение в скрипт
er.sql - сам файл
...
Рейтинг: 0 / 0
25.12.2018, 17:33
    #39752966
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение в скрипт
rinaceHawkmoon,

Это на самый крайний случай. Не хотелось бы на продакшн постоянно создавать и убивать функции

Если нужно постоянно, то создать и не убивать функцию?
Просто храня ее на месте?

очевидно же, из ваших слов, что:
- задача периодичная
- нужная
- еще и поддерживать нужно будет

Самое время лепить функцию с названием
____mega_important_business_task___DO_NOT_DROP(cccc varchar)

Или - палиться не хотите, а выполнять функцию хотите? :)
Ну тогда заверните в отдельную схему, выдайте отдельные привилегии для security definer, выдайте права кому нужно вызывать...

короче, use grants, luke.
как то так.
...
Рейтинг: 0 / 0
26.12.2018, 10:59
    #39753303
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение в скрипт
rinace,

К сожалению нет прямой возможности передать значение внутрь plpgsql блока.
Нужно использовать обходные пути, например пользовательские параметры:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
$ cat p.sql
select set_config('my.param', :'param', false);
do $$begin raise notice '%', current_setting('my.param'); end;$$;

$ psql -f p.sql --set param='Hello, World!'
  set_config   
---------------
 Hello, World!
(1 row)

psql:p.sql:2: NOTICE:  Hello, World!
DO
...
Рейтинг: 0 / 0
27.12.2018, 11:06
    #39753806
rinace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать значение в скрипт
Павел Лузанов,


Павел Лузановrinace,

К сожалению нет прямой возможности передать значение внутрь plpgsql блока.
Нужно использовать обходные пути, например пользовательские параметры:
[/SRC]
Именно так и поступил .
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Передать значение в скрипт / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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