Я переношу хранимые процедуры из SQL Server в PostgreSQL. Я преобразовал хранимую процедуру в функцию Postgres. Сервер хранимая процедураСохраненная процедура Перемещение SQL Server в PostgreSQL
SQL:
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 верно, особенно при использовании bytea для двоичного (16) вместо бита (16). Любая помощь или понимание будут оценены.
Ваш второй параметр является 'bytea' не' long' значение. См. Руководство для получения подробной информации о том, как передать литерал «blob»: http://www.postgresql.org/docs/current/static/datatype-binary.html –
И было бы более эффективным (и надежным) использовать ' вставлять в конфликт' вместо утверждения if. –