PostgreSQL: загадочная ошибка при попытке вставить в таблицу метку времени - PullRequest
0 голосов
/ 19 апреля 2011

У меня есть следующая хранимая процедура:

Create FUNCTION createidentity7(new_browser_id bigint, sn smallint, sn_id bigint,
     last_updated timestamp with time zone, cred_mask_pos integer)

  RETURNS integer AS

  $BODY$

DECLARE

    mask integer = 0;

BEGIN

    if (sn = 0 AND sn_id = 0) then

        Select COALESCE(max(i.cred_mask_pos)+1,0) into mask FROM 
                            identity i WHERE i.browser_id = @browser_id;

    end if;

    Insert into identity(browser_id, sn_id, last_updated, cred_mask_pos, sn)
    Values(@new_browser_id, @sn_id, @last_updated::timestamp with time zone,
                                                                mask, @sn);

    Return mask;

END;
$BODY$
Language 'plpgsql'

Когда я ее вызываю:

select createidentity7
          (0::bigint, 0::smallint, 0::bigint ,'2004-10-19 10:23:54+02', 0);

Я получаю эту ошибку:

ERROR: operator does not exist: @ timestamp with time zone

Состояние SQL: 42883 Подсказка: ни один оператор не соответствует указанному имени и типу аргумента.Возможно, вам придется добавить явные приведения типов.Контекст: функция PL / pgSQL "createidentity7" строка 7 в операторе SQL

Это звонит кому-нибудь?Я нигде не могу найти ничего похожего на эту проблему после долгих поисков.Помощь будет высоко ценится.

1 Ответ

2 голосов
/ 19 апреля 2011

Вам не нужны знаки @ для ссылки на переменные в PLPGSQL, этот синтаксис взят из (AFAIK) T-SQL.Знак @ используется для абсолютного значения в PostgreSQL, и PostgreSQL говорит, что не знает, как получить абсолютное значение временной метки.@ отлично работает с другими параметрами, потому что они числовые.Удалите знаки @, и это должно сработать.

...