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

Стоит задача переписать на PL/Pgsql часть хранимки созданой первоначально для MSSQL.

Осбенность в том что хранимка работает в нескольких потоках, для нескольких процессов, поэтому вставка значений в хранимке была реализована через MSSQL MERGE.

Если я правильно понял аналога MSSQL MERGE в постгре нету, есть что-то похожее но не совсем то. Может не там смотрел.

Подскажите как будет правильно представить след. задачу на PL/Pgsql учитывая особенность использования :

Имеем:
Код: sql
1.
2.
3.
4.
5.
6.
7.
Table1
(
  ID int,
  ItemID int,
  Name varchar(255),
  WebSite varchar(255)
)


и
Код: sql
1.
2.
3.
4.
5.
6.
Table2
(  
  ID int,
  ItemID int,
  WebSite varchar(255)
)



Делается сама вставка:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
MERGE Table1 AS Target
USING
(
  SELECT 
    ItemID,
    WebSite
  FROM Table2
  
) AS Source (ItemID, WebSite)
ON Target.ItemID = Source.ItemID
WHEN NOT MATCHED BY TARGET THEN
  INSERT
  (
    ItemID,
    WebSite
  )
  VALUES
  (
    Source.ItemID,
    Source.Website
  )
OUTPUT Source.ID, INSERTED.ID INTO @TempTable (ID1, ID2);
...
Рейтинг: 0 / 0
переезд на PostgreSQL
    #39082568
Author the new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sancoma,

что-то такое
create or replace function work.inserter() returns void as
$code$
declare
r record;
begin
for r in select * from table2 loop
begin
insert into t1(ItemId, WebSite) values(r.ItemId, r.WebSite);
exception
when unique_violation then null;
end;
end loop;
end;
$code$
language plpgsql
...
Рейтинг: 0 / 0
переезд на PostgreSQL
    #39082580
Author the new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sancoma,

Или лучше так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or replace function work.junk() returns table(id1 int, id2 int) as 
$code$
declare
 r record;
 iid int;
begin
 for r in select * from table2 loop
      begin
         insert into t1(ItemId, WebSite) values(r.ItemId, r.WebSite) returning t1.id into id1;         
      exception
        when unique_violation then id1:=(select id from t1 where t1.itemid=r.itemid);
      end;
      id2:=r.id;
      return next;
 end loop;
end;
$code$
language plpgsql
...
Рейтинг: 0 / 0
переезд на PostgreSQL
    #39082602
sancoma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Author the new one,

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


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