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 |
skytf=> select version(); |
1.2 创建测试 shell 脚本
1 |
[pg92@redhatB tf]$ cat insert.sh |
备注:通过 insert.sh 脚本主要是想查看下返回状态。
1.3 执行脚本
1 |
[pg92@redhatB tf]$ ./insert.sh |
备注:脚本返回的是 0。
1.4 查看数据
1 |
skytf=> select * From test_stop; |
备注:insert_1.sql 脚本中原本想插入 3 条数据,其中第二条报错了,但第二条之后的 SQL 会被执行。如果想让 SQL 报错时停住不往下执行怎么办?接着测试。
设置 ON_ERROR_STOP 选项
2.1 更改 insert_1.sql 脚本
1 |
[pg92@redhatB tf]$ cat insert_1.sql |
备注:设置 ON_ERROR_STOP
2.2 清理数据
1 |
skytf=> truncate table test_stop; |
2.3 执行脚本
1 |
[pg92@redhatB tf]$ ./insert.sh |
备注:这时脚本返回的错误代码为 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