PostgreSQL:尝试使用时间戳插入表时出现神秘错误

时间:2011-04-19 04:20:04

标签: sql postgresql plpgsql

我有以下存储过程:

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   提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。   上下文:SQL语句中的PL / pgSQL函数“createidentity7”第7行

这对任何人都响了吗?经过一番搜索,我找不到任何类似这个问题的东西。非常感谢帮助。

1 个答案:

答案 0 :(得分:2)

您不需要@符号来引用PLPGSQL中的变量,该语法来自(AFAIK)T-SQL。 @符号用于PostgreSQL中的absolute value,PostgreSQL表示它不知道如何获取时间戳的绝对值。 @可以正常使用其他参数,因为它们是数字的。删除@标志,它应该有效。