2016-06-27 76 views
0

我是学习存储过程的新手,其中SQL执行存储过程时出现'令牌未知'的错误

我想创建一个存储过程,通过计算从自动数据插入值。

Attendance

EMPL_KODE |EMPL_NAME |DATE_IN |TIME_IN |TIME_OUT|TIME_IN |TIME_OUT 
001  | Michel |25.04.2016 |06:50 |15:40 |  | 
002  | Clara  |25.04.2016 |06:15 |15:43 |  | 
003  | Rafael |25.04.2016 |06:25 |15:45 |  | 
001  | Michel |26.04.2016 |06:23 |15:42 |  | 
002  | Clara  |26.04.2016 |06:10 |15:41 |  | 
003  | Rafael |26.04.2016 |06:30 |15:42 |  | 
001  | Michel |27.04.2016 |06:33 |15:42 |  | 
002  | Clara  |27.04.2016 |06:54 |15:44 |  | 
003  | Rafael |27.04.2016 |07:00 |15:45 |  | 

我想通过创建一个存储过程,以填补自动TIME_INTIME_OUT值。下面是代码:

CREATE PROCEDURE InsertTotalEmployee 
    @TOTAL_MINUTES int, 
    @TOTAL_HOURS float 
AS 
BEGIN 
    INSERT INTO ATTENDANCE (TOTAL_MINUTES, TOTAL_HOURS) 
    VALUES (
     SELECT 
      DATEDIFF(MINUTE, ATTENDANCE.TIME_IN, ATTENDANCE.TIME_OUT), 
      DATEDIFF(MINUTE, ATTENDANCE.TIME_IN, ATTENDANCE.TIME_OUT)/60.0 
    ) 
END 

后,我写和执行我的发言,会出现一个消息错误:

令牌未知 - 2号线,5列@

我运行代码使用Flamerobin。

+0

另外:你有一致的错字 - 这是**出席**(而不是“随意”,因为你继续拼写它) –

+1

@marc_s我很抱歉我犯的错误。感谢您提醒。 –

回答

1

它看起来像你试图在Firebird中使用Microsoft SQL Server语法,这是行不通的。

其中之一,@是不允许这样的标识符(除非你使用双引号),参数列表必须括在括号内。

请参阅CREATE PROCEDURE的语法。您需要将其更改为:

CREATE PROCEDURE InsertTotalEmployee(TOTAL_MINUTES int, TOTAL_HOURS float) 

您也可能希望将数据类型更改floatdouble precision,和存储过程的身体似乎因为你是从什么选择是不完整的(一个select需要一个表从中选择),并在语句结尾缺少分号。

总而言之,我建议你学习Firebird language reference,然后尝试创建一个功能插入,然后创建一个存储过程。

另请注意,在Flamerobin中创建存储过程时,必须使用set term来切换语句终结符,否则Flamerobin无法正确发送存储过程,另请参阅Procedural SQL (PSQL) Statements中的第一部分。

+0

感谢给我解释。但是,我仍然对输入和输出参数感到困惑。还有关于声明变量。 –

+0

它在[documentation](http://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql.html)中有解释,否则你应该问一个新的具体问题。 –

相关问题