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_IN和值。TIME_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 运行代码。

4

1 回答 1

1

看起来您正在尝试在 Firebird 中使用 Microsoft SQL Server 语法,但这是行不通的。

一方面,@在标识符中不允许使用 (除非您在它们周围使用双引号),并且参数列表必须用括号括起来。

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

CREATE PROCEDURE InsertTotalEmployee(TOTAL_MINUTES int, TOTAL_HOURS float)

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

总而言之,我建议您研究Firebird 语言参考,然后尝试创建一个功能插入,然后才围绕它创建一个存储过程。

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

于 2016-06-27T09:29:51.263 回答