我是 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运行代码。
答案 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中的第一部分