2011-04-19 55 views
0

当神秘的错误,我有以下存储过程:PostgreSQL的:试图插入到表时间戳

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 state: 42883 Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts. Context: PL/pgSQL function "createidentity7" line 7 at SQL statement

这个铃响了吗 对任何人?经过一番搜索,我找不到任何类似这个问题的地方。帮助将不胜感激。

回答

2

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