在hsqldb上运行触发的postgresql函数
我找不到转移我的职能的解决办法 让我们管理postgresql上的工作函数和触发器,如下所示:在hsqldb上运行触发的postgresql函数,postgresql,function,triggers,hsqldb,Postgresql,Function,Triggers,Hsqldb,我找不到转移我的职能的解决办法 让我们管理postgresql上的工作函数和触发器,如下所示: CREATE FUNCTION func_check_minutes() RETURNS trigger AS $$ BEGIN IF (SELECT minutes + NEW.minutes FROM employees WHERE date = NEW.date) > 50 THEN RETURN NULL;
CREATE FUNCTION func_check_minutes() RETURNS trigger AS
$$
BEGIN
IF (SELECT minutes + NEW.minutes FROM employees WHERE date = NEW.date) > 50
THEN RETURN NULL;
END IF;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
CREATE TRIGGER tr_check_minutes
BEFORE INSERT ON employees
FOR EACH ROW
EXECUTE PROCEDURE func_check_minutes();
甚至可以在hslqdb上运行此功能吗
因为当我尝试在没有语言命令的情况下运行它时,显然出现了一个错误:
DatabaseException:意外标记:触发器
我有语法错误,所以我不知道这是否可能。我从文档中阅读了hsqldb中的函数和触发器,但没有注意到任何关于hsqldb中触发函数的示例
在@fredt的帮助下,我创建了查询:
<sql dbms="hsqldb">
DROP TRIGGER IF EXISTS tr_check_minutes
CREATE TRIGGER tr_check_minutes
BEFORE INSERT ON hours_worked
FOR EACH ROW
BEGIN ATOMIC
IF (SELECT sum(minutes) + NEW.minutes FROM hours_worked WHERE date = NEW.date) > 1440
THEN RETURN NULL;
END IF;
RETURN NEW;
END
</sql>
但它打印了一个错误:
用户缺少权限或找不到对象:NEW.DATE如果希望在工作时间过长时插入失败,可以引发异常:
CREATE TRIGGER tr_check_minutes
BEFORE INSERT ON hours_worked
REFERENCING NEW ROW AS NEW
FOR EACH ROW
BEGIN ATOMIC
IF (SELECT sum(minutes) + NEW.minutes FROM hours_worked WHERE date = NEW.date) > 1440
THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'too many hours';
END IF;
END
这是可能的。对于这样的简单触发器,不需要单独的函数。语法在这里讨论。我更新了我的问题。谢谢帮助!您的解决方案看起来是可行的,但出现了一个错误:意外的语句结尾:required:;:行:7,但我有;在特定的行信号SQLSTATE'45000'处设置MESSAGE_TEXT='too many hours';您正在使用一个工具来执行SQL,当SQL到达第一个分号时,该工具正在剪切SQL。您是对的,我只是需要更改end delimeter。感谢您的时间和努力!: