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

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

if ()
begin
insert ..
delete ..
end

и т.д.

Как сделать так же в скиптах для PostgreSQL?
...
Рейтинг: 0 / 0
25.07.2016, 11:44
    #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
25.07.2016, 11:47
    #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
25.07.2016, 12:00
    #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
25.07.2016, 12:30
    #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
25.07.2016, 12:32
    #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
25.07.2016, 19:37
    #39279896
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать повторно-выполняемый скрипт?
Ролг Хупин,

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

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

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

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


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


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