表Attendance
:
EMPL_KODE |EMPL_NAME |DATE_IN |TIME_IN |TIME_OUT|TOTAL_MIN |TOTAL_HOUR
--------------------------------------------------------------------------
001 | Michel |25.04.2016 |06:50 |15:40 |NULL |NULL
002 | Clara |25.04.2016 |06:15 |15:43 |NULL |NULL
003 | Rafael |25.04.2016 |06:25 |15:45 |NULL |NULL
001 | Michel |26.04.2016 |06:23 |15:42 |NULL |NULL
002 | Clara |26.04.2016 |06:10 |15:41 |NULL |NULL
003 | Rafael |26.04.2016 |06:30 |15:42 |NULL |NULL
001 | Michel |27.04.2016 |06:33 |15:42 |NULL |NULL
002 | Clara |27.04.2016 |06:54 |15:44 |NULL |NULL
003 | Rafael |27.04.2016 |07:00 |15:45 |NULL |NULL
我已经成功地创建了一个过程来自动插入列TOTAL_MIN
和TOTAL_HOUR
的值,语法如下:
SET TERM ^ ;
ALTER PROCEDURE UPDATEEMPLOYEES
AS
DECLARE VARIABLE EMPL_KODE CHAR(5);
DECLARE VARIABLE EMPL_NAME VARCHAR (25);
DECLARE VARIABLE TIME_IN TIMESTAMP;
DECLARE VARIABLE TIME_OUT TIMESTAMP;
DECLARE VARIABLE TOTAL_MINUTES INTEGER;
DECLARE VARIABLE TOTAL_HOURS FLOAT;
BEGIN
FOR SELECT e.EMPL_KODE, e.EMPL_NAME,
CAST(a.DATE_IN + a.TIME_IN AS TIMESTAMP),
CAST(a.DATE_IN + a.TIME_OUT AS TIMESTAMP),
DATEDIFF(MINUTE,a.TIME_IN,a.TIME_OUT),
DATEDIFF(HOUR,a.TIME_IN,a.TIME_OUT)
FROM EMPLOYEE e
JOIN ATTENDANCE a
ON e.EMPL_KODE=a.EMPL_KODE
INTO :EMPL_KODE,:EMPL_NAME,:TIME_IN,:TIME_OUT,TOTAL_MINUTES,TOTAL_HOURS
DO
UPDATE ATTENDANCE a
set a.TOTAL_MINUTES=:TOTAL_MINUTES,
a.TOTAL_HOURS=:TOTAL_HOURS
WHERE a.EMPL_KODE=:EMPL_KODE;
end^
SET TERM ; ^
但是,问题是我如何直接用UPDATE
或INSERT INTO
编写语法?我试过了,但还是不行。
我编写的代码与Firebird指令相同。
UPDATE OR INSERT INTO
{tablename | viewname} [(<columns>)]
VALUES (<values>)
[MATCHING (<columns>)]
[RETURNING <values> [INTO <variables>]]
<columns> ::= colname [, colname ...]
<values> ::= value [, value ...]
<variables> ::= :varname [, :varname ...]
下面是我的代码:
我不写Returning
因为我不明白它是什么。
SET TERM ^ ;
ALTER PROCEDURE BLABLA(
TOTAL_M INTEGER,
TOTAL_H FLOAT)
AS
BEGIN
UPDATE or INSERT INTO ATTENDANCE (TOTAL_MINUTES,TOTAL_HOURS)
VALUES (:TOTAL_M,:TOTAL_H)
MATCHING (EMPL_KODE);
end^
SET TERM ; ^
在我提交语句之后,它显示了错误消息:
UPDATE OR INSERT字段列表不匹配匹配子句
我认为问题是你有MATCHING (EMPL_KODE)
,但你不列出EMPL_KODE
列在值列表-你如何期望引擎找出哪些行更新?试试这样写:
SET TERM ^ ;
ALTER PROCEDURE BLABLA(
E_KODE CHAR(5),
TOTAL_M INTEGER,
TOTAL_H FLOAT)
AS
BEGIN
UPDATE or INSERT INTO ATTENDANCE (TOTAL_MINUTES,TOTAL_HOURS, EMPL_KODE)
VALUES (:TOTAL_M,:TOTAL_H, :E_KODE)
MATCHING (EMPL_KODE);
end^
SET TERM ; ^
最后,我得到了答案http://www.firebirdfaq.org/faq336
SET TERM ^ ;
ALTER PROCEDURE UPDATEEMPLOYEEES
AS
begin
UPDATE ATTANDENCE
SET TOTAL_MINUTES=DATEDIFF(MINUTE,TIME_IN,TIME_OUT),
TOTAL_HOURS=DATEDIFF(MINUTE,TIME_IN,TIME_OUT)/60.0;
END^
SET TERM ; ^