PostgreSQL: psql 命令 ON_ERROR_STOP 选项讲解

psql是连接 PostgreSQL 库的命令行交互式工具,相当于 oracle 的 sqlplus ,其中特性非常丰富,今天无意间查看到 ON_ERROR_STOP 特性,简单演示下。

ON_ERROR_STOP 属于 psql 的高级特性设置,更改后会影响 psql 的行为,一般不轻易更改,
除非是有特殊需求。

关于 ON_ERROR_STOP 的演示,首先得从脚本中命令执行说起,在 PostgreSQL 中的 DB 脚本(假如是 100 条 INSERT )执行时会从上往下依次执行,当然,如果这个脚本全部正常,当然OK,那么如果其中有条由于某种原因执行报错怎么办?psql 默认的特性是继续处理这个 ERROR 之后的 SQL,接着演示:

psql 默认的行为

1.1 创建测试表

1
2
3
4
5
6
7
8
skytf=> select version();
version
-------------------------------------------------------------------------------------------------------
PostgreSQL 9.2.1 on i686-pc-linux-gnu, compiled by gcc (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3), 32-bit
(1 row)

skytf=> create table test_stop(id int4,name varchar(32));
CREATE TABLE

1.2 创建测试 shell 脚本

1
2
3
4
5
6
7
8
9
10
[pg92@redhatB tf]$ cat insert.sh
#!/bin/bash

psql -h 127.0.0.1 -d skytf -U skytf -f insert_1.sql
echo $?

[pg92@redhatB tf]$ cat insert_1.sql
insert into test_stop values (1,'a');
insert into test_stop values (2,b); --注意:这条 INSERT 将会报错
insert into test_stop values (3,'c');

备注:通过 insert.sh 脚本主要是想查看下返回状态。

1.3 执行脚本

1
2
3
4
5
6
7
[pg92@redhatB tf]$ ./insert.sh
INSERT 0 1
psql:insert_1.sql:2: ERROR: column "b" does not exist
LINE 1: insert into test_stop values (2,b);
^
INSERT 0 1
0

备注:脚本返回的是 0。

1.4 查看数据

1
2
3
4
5
6
skytf=> select * From test_stop;
id | name
----+------
1 | a
3 | c
(2 rows)

备注:insert_1.sql 脚本中原本想插入 3 条数据,其中第二条报错了,但第二条之后的 SQL 会被执行。如果想让 SQL 报错时停住不往下执行怎么办?接着测试。

设置 ON_ERROR_STOP 选项

2.1 更改 insert_1.sql 脚本

1
2
3
4
5
6
[pg92@redhatB tf]$ cat insert_1.sql
set ON_ERROR_STOP on

insert into test_stop values (1,'a');
insert into test_stop values (2,b);
insert into test_stop values (3,'c');

备注:设置 ON_ERROR_STOP

2.2 清理数据

1
2
skytf=> truncate table test_stop;
TRUNCATE TABLE

2.3 执行脚本

1
2
3
4
5
6
[pg92@redhatB tf]$ ./insert.sh
INSERT 0 1
psql:insert_1.sql:4: ERROR: column "b" does not exist
LINE 1: insert into test_stop values (2,b);
^
3

备注:这时脚本返回的错误代码为 3。

2.4 验证数据

skytf=> select * From test_stop;
id | name
----+------
 1 | a
(1 row)

备注:可见脚本执行到第二条 INSERT 报错时没有往下继续执行,这就是 ON_ERROR_STOP 的作用,根据字面很好理解,遇到错误就停止。

附: Exit Status

psql returns 0 to the shell if it finished normally,
1 if a fatal error of its own occurs (e.g. out of memory, file not found),
2 if the connection to the server went bad and the session was not interactive,
3 if an error occurred in a script and the variable ON_ERROR_STOP was set.

备注:上面是 psql 在不同情况下返回给操作系统的返回值。

参考

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/237936.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论