/ / Przechowywana procedura Migracja SQL Server do PostgreSQL - sql-server, postgresql, stored-procedures, plpgsql

Zapisana procedura migracji SQL Server do PostgreSQL - sql-server, postgresql, stored-procedures, plpgsql

Przechodzę z procedur przechowywanych z SQL Server na PostgreSQL, przekonwertowałem procedurę przechowywaną na funkcję PostgreSQL.

Procedura składowana SQL Server:

CREATE PROCEDURE AddFullSig @CandID int, @FullSig binary(16)
AS
if not exists (select pub_id
from local_lib
where cand_id = @CandID and Full_sig = @FullSig)
insert into local_lib
values(@CandID, 1, @FullSig)
else
update local_lib
set dup_count = dup_count + 1
where cand_id = @CandID
and Full_sig = @FullSig

select pub_id
from local_lib
where cand_id = @CandID and Full_sig = @FullSig

RETURN

Funkcja Postgres:

create type addfullsig_return_type as(
pub_id int
);

create or replace function addfullsig( p_candid int, p_fullsig bytea)
returns addfullsig_return_type as $$
begin

if not exists(select pub_id from local_lib where cand_id = p_candid and full_sig = p_fullsig) then
insert into local_lib values(default, p_candid, 1, p_fullsig);
else
update local_lib set dup_count = dup_count + 1 where cand_id = p_candid and full_sig = p_fullsig;
end if;

select pub_id from local_lib where
cand_id = p_candid and full_sig = p_fullsig;
end;
$$ language plpgsql;

Kiedy próbuję przetestować to w pgadmin za pomocą:

select * from addfullsig(3,1010111011111011);

Otrzymuję błąd:

BŁĄD: funkcja addfullsig (integer, bigint) nie istnieje

Nie jestem pewien, czy moja konwersja na postgresql jest poprawna, szczególnie w przypadku użycia bytea dla binarnego (16) zamiast bitu (16). Każda pomoc lub wgląd byłby doceniony.

Odpowiedzi:

2 dla odpowiedzi № 1

Sekwencja liczb 1 i 0 jest analizowana jako liczba całkowita i domyślna jest typu bigint.

Użyj składni bitów:

select * from addfullsig(3,B"1010111011111011");

Zobacz więcej tutaj