database - 将变量声明为 ROWTYPE - 触发函数
问题描述
在这个问题中,我创建了一个名为 groups(id, name, group_id INTEGER NULLABLE,class_id INTEGER NULLABLE) 的表,其逻辑是对组、类和子类之间的数据进行分类。一个组有很多类,一个类有很多子类。我想在 plpgsql 中创建一个触发器函数,以保证插入或更新数据之前的一些条件。
数据分类条件如下。
组:
用户只需要插入名称值。
group_id和clazz_id必须为 NULL 值。类:
用户只需要插入name和group_id值。
group_id必须是 INTEGER NOT NULL 值,而clazz_id是 NULL VALUE。
group_id必须符合条件才能归类为组。
子类:
用户只需插入name、group_id和clazz_id值。因此,您可以将group_id值设置为属于 clazz_id 的group_id以保证条件为真。
group_id必须与设置的class_id相同。
clazz_id必须注意分类为类的条件。
.
CREATE FUNCTION emp_subclasse() RETURNS trigger AS $subclasse_verification$
DECLARE
group groups%ROWTYPE;
classe groups%ROWTYPE;
class_group groups%ROWTYPE;
BEGIN
group =(SELECT * FROM groups WHERE id=NEW.group_id);
classe =(SELECT * FROM groups WHERE id=NEW.clazz_id);
class_group =(SELECT * FROM groups WHERE id=classe.group_id);
IF NEW.clazz_id IS NOT NULL THEN
IF (classe.group_id) IS NULL THEN
RAISE EXCEPTION 'A CLASS MUST POINT TO A GROUP';
ELSIF classe.group_id IS NOT NULL THEN
NEW.group_id = classe.group_id;
IF class_group.group_id IS NOT NULL OR class_group.clazz_id IS NOT NULL THEN
RAISE EXCEPTION 'A GROUP CANNOT HAVE A GROUP_ID OR CLASS_ID POINTED';
END IF;
END IF;
IF classe.clazz_id IS NOT NULL THEN
RAISE EXCEPTION 'CANNOT CLASSIFY A CLASS AS A SUBCLASS';
END IF;
ELSIF NEW.clazz_id IS NULL THEN
IF NEW.group_id IS NOT NULL THEN
IF group.group_id IS NOT NULL OR grupo.clazz_id IS NOT NULL THEN
RAISE EXCEPTION 'A GROUP CANNOT HAVE A GROUP_ID OR CLASS_ID POINTED';
END IF;
END IF;
END IF;
END;
$subclasse_verification$ LANGUAGE 'plpgsql';
CREATE TRIGGER subclasse_verification BEFORE INSERT OR UPDATE ON groups
FOR EACH ROW EXECUTE PROCEDURE emp_subclasse();
但是,当我尝试插入值时,出现错误[2018-11-20 16:35:20] [42601] ERROR: subquery must return only one column
[2018-11-20 16:35:20] WHERE: PL/pgSQL function emp_subclasse() line 7 at assignment
解决方案
group =(SELECT * FROM groups WHERE id=NEW.group_id);
classe =(SELECT * FROM groups WHERE id=NEW.clazz_id);
class_group =(SELECT * FROM groups WHERE id=classe.group_id);
这些子查询返回所有列 (SELECT *)。要正确填充变量,请选择行而不展开:group := (SELECT groups FROM groups WHERE ...)
或执行 SELECT INTO:SELECT * INTO group FROM groups WHERE ...
推荐阅读
- java - 尝试在不打开 gmail 的情况下发送电子邮件时应用程序崩溃
- mongodb - 手动恢复 /var/lib/mongodb 后 mongodb 未启动
- typescript - Typescript for newbies: can be typeA or typeB situation
- ios - 为什么我的 html 没有加载到我的 WKWebView
- c# - 分组类
- c++ - QT 5 - 无法连接以使用其他类中的插槽
- c# - 如何在 Selenium 上获取 SVG 的最后一个元素
- r - 如何将 sparlyr 连接到 spark 独立集群
- mysql - 公式 `mysql` 未安装
- php - 将嵌套数组中的“点表示法”键扩展到子数组