在postgreSQL中引发错误

时间:2012-09-21 10:48:40

标签: postgresql plpgsql quoting

CREATE OR REPLACE FUNCTION msgfailerror() RETURNS trigger AS 
' BEGIN 
    IF NEW.noces< new.first_column THEN 
        RAISE EXCEPTION 'cannot have a negative salary'; 
    END IF; 
   return new; 
END' LANGUAGE plpgsql

触发

create trigger msgfail before insert on first for each row 
execute procedure msgfailerror()

给出错误:

  

语法错误处于或接近“不能”LINE 5:RAISE   EXCEPTION'不能有负面的......

我对每个行字段进行了几乎一次验证。我希望触发器在插入完成时检查所有验证,然后一次性提高错误日志。我应该在加注通知时使用加注例外吗?

例如:

Insert into first (first_column, noces,dob) values ('4545','75','545') 

我正在检查noces是否小于first_column,对于同一行我想检查dob&gt; 80并且first_column是整数并且为所有验证引发错误。提前致谢

3 个答案:

答案 0 :(得分:17)

引用错误。使用美元报价$$:

更容易
CREATE OR REPLACE FUNCTION msgfailerror() 
RETURNS trigger AS 
$$
BEGIN 
  IF NEW.noces< new.first_column THEN 
    RAISE EXCEPTION 'cannot have a negative salary'; 
  END IF; 
  return new; 
END;
$$
LANGUAGE plpgsql;

但另一方面,检查约束有什么问题?

答案 1 :(得分:1)

我同意Frank你可以更好地使用约束,但你称之为验证。验证通常在插入之前完成。如果您想验证插入,可以使用函数而不是触发器或约束。

当您编写函数时,您的问题的答案是提出异常或通知,只要没有写入操作,通知就足够了(与离开函数一起)。一旦写入数据库,您是否必须在执行回滚时使用异常。

像这样:

CREATE OR REPLACE FUNCTION field_validate(p_int int) RETURNS boolean AS $$

DECLARE
 i_id int;
BEGIN 
  if p_int > 10 then
   raise notice 'should be smaller then 10';
   return false;
  end if;
  insert into tbl_numbers(firstfield) values(p_int) returning id in i_id;
  insert into tbl_fake(nofield) values(i_id);
  return true;
EXCEPTION
  WHEN raise exception THEN
   return false;
END;
$$ LANGUAGE plpgsql;

答案 2 :(得分:0)

你唯一没有问题是使用引号

请改变:

RAISE EXCEPTION 'cannot have a negative salary';

为:

RAISE EXCEPTION ''cannot have a negative salary'';

&#39;&#39;与&#34;

不同

&#39;&#39; =两个单引号