执行存储过程时出现“令牌未知”错误

时间:2016-06-27 07:18:32

标签: firebird flamerobin

我是 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运行代码。

1 个答案:

答案 0 :(得分:1)

看起来你正试图在Firebird中使用Microsoft SQL Server语法,但这不会起作用。

首先,@不允许像标识符那样(除非你在它们周围使用双引号),参数列表必须括在括号中。

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

CREATE PROCEDURE InsertTotalEmployee(TOTAL_MINUTES int, TOTAL_HOURS float)

您还可能希望将数据类型float更改为double precision,并且存储过程的主体似乎不完整,因为您从无选择(select需要一个表从中选择,并在语句末尾缺少分号。

总而言之,我建议您研究Firebird language reference,然后尝试创建一个正常运行的插入,然后围绕它创建一个存储过程。

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