powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование анонимной функции DO
12 сообщений из 12, страница 1 из 1
Использование анонимной функции DO
    #38583064
Josefina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотрела документацию, погуглила, и тем не менее не понимаю, как пользоваться этими функциями.

Написала следующую функцию, проверяющую наличие БД и при необходимости ее создающее:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
DO 
$do$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = 'mydb') THEN
	   CREATE DATABASE masterm WITH OWNER = root ENCODING = ''UTF8'' TABLESPACE = masterm_tablespace LC_COLLATE = ''Russian_Russia.1251'' LC_CTYPE = ''Russian_Russia.1251'' CONNECTION LIMIT = -1;
	END IF;
END;
$do$



Вставляю в консоль, выполняется без ошибок, но и ничего не происходит.

Что же не так?
...
Рейтинг: 0 / 0
Использование анонимной функции DO
    #38583110
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай - версия точно позволяет использовать анонимные блоки?

Когда я в свое время это пытался сделать и выполнял на 8.4 - получал обломс...
...
Рейтинг: 0 / 0
Использование анонимной функции DO
    #38583146
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Josefina
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DO 
$do$
DECLARE
    _exists boolean;
BEGIN
    _exists:=  EXISTS (SELECT 1 FROM pg_database WHERE datname = 'mydb') ;
    RAISE NOTICE '_exists %' , _exists;
    IF NOT _exists THEN
	   CREATE DATABASE masterm WITH OWNER = root ENCODING = ''UTF8'' TABLESPACE = masterm_tablespace LC_COLLATE = ''Russian_Russia.1251'' LC_CTYPE = ''Russian_Russia.1251'' CONNECTION LIMIT = -1;
	END IF;
END;
$do$



нотификацию вставьте.
...
Рейтинг: 0 / 0
Использование анонимной функции DO
    #38583225
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
CREATE DATABASE cannot be executed inside a transaction block.
...
Рейтинг: 0 / 0
Использование анонимной функции DO
    #38583257
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторCREATE DATABASE cannot be executed inside a transaction block.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DO 
$do$
DECLARE
    _exists boolean;
    _sql text;
BEGIN
    CREATE EXTENSION IF NOT EXISTS dblink;
    _exists:=  EXISTS (SELECT 1 FROM pg_database WHERE datname = 'mydb') ;
    RAISE NOTICE '_exists %' , _exists;
    IF NOT _exists THEN
	   _sql:=$$CREATE DATABASE masterm WITH OWNER = root ENCODING = ''UTF8'' TABLESPACE = masterm_tablespace LC_COLLATE = ''Russian_Russia.1251'' LC_CTYPE = ''Russian_Russia.1251'' CONNECTION LIMIT = -1$$;
             PERFORM dblink_exec('dbname='||quote_ident(current_database() ),_sql);
	END IF;
END;
$do$
...
Рейтинг: 0 / 0
Использование анонимной функции DO
    #38583290
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
qwwq, это мне? я так умею .
не понятно с чем борется ТС.
...
Рейтинг: 0 / 0
Использование анонимной функции DO
    #38583342
йццй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
V&N qwwq, это мне? я так умею .
не понятно с чем борется ТС.интуичу:
ТС борется с отсутствием ";" в конце SQL в psql, сдаётся мне.
...
Рейтинг: 0 / 0
Использование анонимной функции DO
    #38583501
Josefina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HawkmoonНа всякий случай - версия точно позволяет использовать анонимные блоки?

Когда я в свое время это пытался сделать и выполнял на 8.4 - получал обломс...

версия последняя 9.3 ...
...
Рейтинг: 0 / 0
Использование анонимной функции DO
    #38583503
Josefina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
йццйV&N qwwq, это мне? я так умею .
не понятно с чем борется ТС.интуичу:
ТС борется с отсутствием ";" в конце SQL в psql, сдаётся мне.

ага, так и есть, добавила ";" в конце и функция начала выполняться ))


...
Перепробовала все предложенные тут варианты, ошибка: CREATE DATABASE не может выполняться внутри функции или строки.
Получается только отдельными запросами с клиента можно проверить существование БД?
...
Рейтинг: 0 / 0
Использование анонимной функции DO
    #38583509
Josefina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqавторCREATE DATABASE cannot be executed inside a transaction block.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DO 
$do$
DECLARE
    _exists boolean;
    _sql text;
BEGIN
    CREATE EXTENSION IF NOT EXISTS dblink;
    _exists:=  EXISTS (SELECT 1 FROM pg_database WHERE datname = 'mydb') ;
    RAISE NOTICE '_exists %' , _exists;
    IF NOT _exists THEN
	   _sql:=$$CREATE DATABASE masterm WITH OWNER = root ENCODING = 'UTF8' TABLESPACE = masterm_tablespace LC_COLLATE = 'Russian_Russia.1251' LC_CTYPE = 'Russian_Russia.1251' CONNECTION LIMIT = -1$$;
             PERFORM dblink_exec('dbname='||quote_ident(current_database() ),_sql);
	END IF;
END;
$do$
;



Это запрос у меня тоже выдает ошибку, пока разбираюсь, как ее понимать:

ОШИБКА: could not establish connection
ПОДРОБНОСТИ: fe_sendauth: no password supplied

КОНТЕКСТ: SQL-оператор: "SELECT dblink_exec('dbname='||quote_ident(current_database() ),_sql)" функция PL/pgSQL inline_code_block, строка 1, оператор PERFORM
...
Рейтинг: 0 / 0
Использование анонимной функции DO
    #38583568
Josefina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы исправить последнюю ошибку, внесла изменения в pg_hba.conf:

# TYPE DATABASE USER ADDRESS METHOD

# IPv4 local connections:
local all all md5
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#host replication postgres 127.0.0.1/32 md5
#host replication postgres ::1/128 md5

добавилась строка local, но с такими изменениями служба запускаться не хочет...
...
Рейтинг: 0 / 0
Использование анонимной функции DO
    #38583817
Josefina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну и разобралась почему не хочет...

2014-03-12 14:47:28 NOVT ОТМЕТКА: локальные подключения не поддерживаются в этой сборке
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование анонимной функции DO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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