use*_*024 3 sql postgresql stored-procedures exception
我有两张表,我正在将数据从一张表插入到另一张表。
insert into a (id1, value1)
select id, value from b
Run Code Online (Sandbox Code Playgroud)
id1 是唯一的,当我在表 b 中有重复的 id 时。如何在不停止执行的情况下捕获 PostgreSQL 中每一行的异常。
如果你不能像@a_horse_with_no_name 建议的那样做并避免异常,那么循环查询并执行BEGIN ... EXCEPTION ...块的 PL/PgSQL 过程就是要走的路。
这是大规模比具有滤除该问题行效率较低WHERE子句和(如果需要)加入,所以应该如果可能避免。
需要的主要时间是,例如,如果验证代码抛出异常,您无法运行以生成where子句的布尔值。不幸的是,PostgreSQL 的大多数数据类型输入函数都没有“测试”模式,您可以在其中获得NULL无效输入的结果或错误标志,因此这通常是日期/时间解析之类的情况。
你想做这样的事情:
DO
LANGUAGE plpgsql
$$
DECLARE
r record;
BEGIN
FOR r IN SELECT a, b FROM mytable
LOOP
BEGIN
INSERT INTO newtable (x, y)
VALUES (r.a, r.b);
EXCEPTION
WHEN check_violation THEN
RAISE NOTICE 'Skipped row %', r.a;
END;
END LOOP;
END;
$$;
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅 PL/PgSQL 手册。
请注意,这对于每一个循环迭代子事务,而且还要求每个迭代执行状态设置,所以它的方式比用做慢INSERT INTO ... SELECT ... WHERE ...。
| 归档时间: |
|
| 查看次数: |
6584 次 |
| 最近记录: |