表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子句
不匹配
我该怎么办?
答案 0 :(得分:3)
我认为问题在于您有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 ; ^
答案 1 :(得分:0)
最后,我从http://www.firebirdfaq.org/faq336
得到了答案isset($$vuln) and $$vuln = htmlentities($$vuln);