【问题标题】:Declare a variable as a ROWTYPE - Trigger function将变量声明为 ROWTYPE - 触发函数
【发布时间】:2019-04-25 14:52:05
【问题描述】:

在这个问题中,我创建了一个名为groups(id, name, group_id INTEGER NULLABLE,class_id INTEGER NULLABLE) 的表,逻辑是将数据在组、类和子类之间进行分类。一个组有很多类,一个类有很多子类。我想在 plpgsql 中创建一个触发器函数,以保证插入或更新数据之前的一些条件。

数据分类条件如下。

  • 组:
    用户只需要插入 name 值。
    group_idclazz_id 必须为 NULL 值。

  • 类:
    用户只需插入 namegroup_id 值。
    group_id 必须是 INTEGER NOT NULL 值,clazz_id 是 NULL VALUE。
    group_id 必须符合条件才能归类为组。

  • 子类:
    用户只需插入 namegroup_idclazz_id 值。因此,您可以设置 group_id 值等于 clazz_id 所属的 group_id 以保证条件为真。
    group_id 必须与 class_id 设置的 group_id 相同。
    clazz_id 必须注意分类为 Class 的条件。

.

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

【问题讨论】:

    标签: database postgresql plpgsql database-trigger sql-function


    【解决方案1】:
      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 ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-26
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      相关资源
      最近更新 更多