0
SQL ServerからPostgreSQLへストアドプロシージャを移行しています。ストアドプロシージャをPostgres関数に変換しました。ストアドプロシージャPostgreSQLへのSQL Serverの移行
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
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;
私が使用してpgAdminででこれをテストしてみてください:
select * from addfullsig(3,1010111011111011);
私はエラーを取得する:
ERROR: function addfullsig(integer, bigint) does not exist
postgresqlへの変換が正しいかどうかわかりません。特にbit(16)ではなくbinary(16)にbyteaを使用している場合は確かです。助けや洞察力があれば感謝します。
あなたの2番目のパラメータは、 '' bytea'ないlong'値である参照してください。 "blob"リテラルを渡す方法の詳細については、マニュアルを参照してください:http://www.postgresql.org/docs/current/static/datatype-binary.html –
そして、 if文の代わりにconflictに挿入してください。 –