powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Можно ли сделать повторно-выполняемый скрипт?
10 сообщений из 10, страница 1 из 1
Можно ли сделать повторно-выполняемый скрипт?
    #39279477
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача выглядит так: есть приложение на c#, которое читает файлы-скрипты с диска и выполняет их на сервере.

В SQL Server есть возможность написать скрипт, который можно несколько раз подряд запустить и быть уверенным, что он выполнится правильно, сделает действие один раз и т.д.
То есть проверить какие-то услови, проверить версию сервера, базы

if ()
begin
insert ..
delete ..
end

и т.д.

Как сделать так же в скиптах для PostgreSQL?
...
Рейтинг: 0 / 0
Можно ли сделать повторно-выполняемый скрипт?
    #39279499
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первое что приходит на ум:
Код: sql
1.
2.
3.
4.
5.
6.
7.
with 
a1 (insert into a1 select ... returns *),
a2 (insert into a2 select ... returns *),
a3 (delete from a2 where returns *),
a4 (delete from a3 where returns *),
a5 (insert into a4 select * from a4 returns *) 
select true;



работает как одна транзакция, если где то даст ошибку то не сработает ничего
returns добавил для того что бы можно было использовать результаты

можно использовать результаты вставки или удаленные строки для последующей вставки (например удалили строки из a4 и вставили их в a5 причем в рамках одной тразакции)

есть особенность: мы на шаге a2 вставили новые строки, на шаге 3 - удаляем из а2, но при этом не увидим новые строки, так что они останутся все равно, даже если удовлетворяли условиям удаления
...
Рейтинг: 0 / 0
Можно ли сделать повторно-выполняемый скрипт?
    #39279503
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного исправил
Код: sql
1.
2.
3.
4.
5.
6.
7.
with 
a1 (insert into tab_a1 select ... returns *),
a2 (insert into tab_a2 select ... returns *),
a3 (delete from tab_a2 where returns *),
a4 (delete from tab_a3 where returns *),
a5 (insert into tab_a4 select * from a4 returns *) 
select true;
...
Рейтинг: 0 / 0
Можно ли сделать повторно-выполняемый скрипт?
    #39279518
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не вижу как я могу использовать условие, например
надуманный скрипт T-SQL:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
if exists (select 1 from table1 where id=13) and not exists
(select 1 from table2 where id=130)
begin
        insert into dictionary1(id, name) select 100, N'kakaya-to fignya'
        update dictionary2 set name=N'bolshaya fignya' where id=101
end
else
begin
        insert into dictionary2(id, name) select 100, N'kakaya-to bolshaya fignya'
        update dictionary1 set name=N'malenkaya fignya' where id=100
end
...
Рейтинг: 0 / 0
Можно ли сделать повторно-выполняемый скрипт?
    #39279559
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, лучшее решение - это анонимные функции

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
-- anonymous functions
do $$
begin
    if not exists(select 1 FROM pg_roles WHERE rolname='theuser') then
        create user theuser;
    end if;
end
$$ language plpgsql;
...
Рейтинг: 0 / 0
Можно ли сделать повторно-выполняемый скрипт?
    #39279561
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
примерно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with t (
       select 
              exists (select 1 from table1 where id=13) 
              and not exists (select 1 from table2 where id=130) as uslovie
),
a       (insert into dictionary1(id, name) select 100, N'kakaya-to fignya'
        where exists (select uslovie from t)
),
b      (
        update dictionary2 set name=N'bolshaya fignya' where id=101
        where exists (select uslovie from t)
),
c      (
        insert into dictionary2(id, name) select 100, N'kakaya-to bolshaya fignya'
        where not exists (select uslovie from t)
),
d      (  
        update dictionary1 set name=N'malenkaya fignya' where id=100
        where not exists (select uslovie from t)
)
select true
...
Рейтинг: 0 / 0
Можно ли сделать повторно-выполняемый скрипт?
    #39279896
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Аналог SQL-серверных скриптов — анонимные блоки или функции. Если нужно что-то вернут по результатам работы, то только функции.
Если есть возможность написать на чистом SQL, то так будет лучше для производительности.
...
Рейтинг: 0 / 0
Можно ли сделать повторно-выполняемый скрипт?
    #39280125
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovРолг Хупин,

Аналог SQL-серверных скриптов — анонимные блоки или функции. Если нужно что-то вернут по результатам работы, то только функции.
Если есть возможность написать на чистом SQL, то так будет лучше для производительности.

Да, спасибо, понял, значит анонимные функции - правильный путь, если это нужно.
А в чем разница между анонимным блоком и функцией - только возвращаемое значение или его отсутствие?
...
Рейтинг: 0 / 0
Можно ли сделать повторно-выполняемый скрипт?
    #39280148
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Кстати для многих типов объектов при их создании/удалении можно проверять наличие объекта.
Например:
Код: sql
1.
2.
3.
drop table IF EXISTS table_name;
или
create table IF NOT EXISTS table_name;


Зачастую этого может быть достаточно без процедурного кода.
...
Рейтинг: 0 / 0
Можно ли сделать повторно-выполняемый скрипт?
    #39280316
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинА в чем разница между анонимным блоком и функцией - только возвращаемое значение или его отсутствие?
Да. Раньше, чтобы выполнить разовый кусок кода, приходилось делать функцию и потом её дропать.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Можно ли сделать повторно-выполняемый скрипт?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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