注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL: psql 命令 ON_ERROR_STOP 选项讲解  

2013-02-06 11:00:26|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


         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 创建测试表
 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 脚本
 [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 执行脚本
 [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 查看数据
 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 脚本
 [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 清理数据
 skytf=> truncate table test_stop;
TRUNCATE TABLE
   

--2.3 执行脚本 
 [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 在不同情况下返回给操作系统的返回值。

四 参考
http://www.postgresql.org/docs/9.2/static/app-psql.html

  评论这张
 
阅读(13296)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016