2016-05-12 7 views
0

Я переношу хранимые процедуры из 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). Любая помощь или понимание будут оценены.

+1

Ваш второй параметр является 'bytea' не' long' значение. См. Руководство для получения подробной информации о том, как передать литерал «blob»: http://www.postgresql.org/docs/current/static/datatype-binary.html –

+0

И было бы более эффективным (и надежным) использовать ' вставлять в конфликт' вместо утверждения if. –

ответ

1

Последовательность 1 и 0 анализируется как целочисленный литерал и предположительно имеет тип bigint.

Используйте бит строки синтаксис:

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

Посмотреть более here

Смежные вопросы