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

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL:使用 "do ..." 命令执行代码段  

2013-05-08 17:33:42|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

     我们知道可以使用 function 来实现较复杂的业务逻辑,有时候在数据库维护过程中需要
执行稍复杂点的维护,但又不想写 function ,这时可以使用 "do "命令了, 这里介绍 "do " 
命令执行代码段的用法。
   
   在介绍 "do" 命令之前先来看一个函数:
   
--1 函数 fun_ins_test_3()
 CREATE or replace FUNCTION  fun_ins_test_3() RETURNS INTEGER  AS $$
   DECLARE
     i INTEGER;
   BEGIN
     perform 1 from pg_tables where schemaname = 'francs' and tablename = 'test_3';
   
     if not found then
       create table test_3(id int4);
     end if;
   
     for i in 1 .. 10000 loop
       insert into test_3 values (i);
     end loop;
     return 1;
   END;
$$ LANGUAGE 'plpgsql';
 备注:函数代码非常简单,向一张表插入数据。
   
--2 执行函数
 francs=> CREATE or replace FUNCTION  fun_ins_test_3() RETURNS INTEGER  AS $$
francs$>    DECLARE
francs$>      i INTEGER;
francs$>    BEGIN
francs$>      perform 1 from pg_tables where schemaname = 'francs' and tablename = 'test_3';
francs$>    
francs$>      if not found then
francs$>        create table test_3(id int4);
francs$>      end if;
francs$>    
francs$>      for i in 1 .. 10000 loop
francs$>        insert into test_3 values (i);
francs$>      end loop;
francs$>      return 1;
francs$>    END;
francs$> $$ LANGUAGE 'plpgsql';
CREATE FUNCTION


francs=> select fun_ins_test_3();
 fun_ins_test_3 
----------------
              1
(1 row)

francs=> select count(*) from test_3;
 count 
-------
 10000
(1 row)
 备注:上面通过创建一个函数向表 test_3 中插入数据,有时觉得一个简单的操作不想再创建一个函数,
            这时就可以使用 do 命令执行代码断了,简单的说 do 命令的代码段就是没有入参并且返回值为
            空的函数的语句体,         

--3 使用 do 命令实现以上功能
 do $$    
   DECLARE
     i INTEGER;
   BEGIN
     perform 1 from pg_tables where schemaname = 'francs' and tablename = 'test_3';
   
     if not found then
       create table test_3(id int4);
     end if;
   
     for i in 1 .. 10000 loop
       insert into test_3 values (i);
     end loop;
   END;
$$ LANGUAGE 'plpgsql';
 

--4 执行测试
 francs=> drop table test_3;
DROP TABLE

francs=> do $$    
francs$>    DECLARE
francs$>      i INTEGER;
francs$>    BEGIN
francs$>      perform 1 from pg_tables where schemaname = 'francs' and tablename = 'test_3';
francs$>    
francs$>      if not found then
francs$>        create table test_3(id int4);
francs$>      end if;
francs$>    
francs$>      for i in 1 .. 10000 loop
francs$>        insert into test_3 values (i);
francs$>      end loop;
francs$>    END;
francs$> $$ LANGUAGE 'plpgsql';
DO

francs=> select count(*) from test_3;
 count 
-------
 10000
(1 row)
  备注:结果和执行函数一样。 do 命令可以很好的和 shell 脚本结合,在维护过程中非常有用,下面
             给个简单的例子。
       
--5 一个简单的 shell
 [pg92@redhatB tf]$ vim insert_test_03.sh 

#!/bin/bash

psql -h 127.0.0.1 -d francs -U francs << EOF
do \$\$
   DECLARE
     i INTEGER;
   BEGIN
     perform 1 from pg_tables where schemaname = 'francs' and tablename = 'test_3';

     if not found then
       create table test_3(id int4);
     end if;

     for i in 1 .. 10000 loop
       insert into test_3 values (i);
     end loop;
   END;
\$\$ LANGUAGE 'plpgsql';
EOF
 
  备注:$$ 符加需要转义,否则会报错。

--6 测试
 [pg92@redhatB tf]$ ./insert_test_03.sh 
DO
 
 
--7 附: DO 命令语法
Name
     DO -- execute an anonymous code block

Synopsis
     DO [ LANGUAGE lang_name ] code

Description
     DO executes an anonymous code block, or in other words a transient anonymous function in a procedural 
     language.The code block is treated as though it were the body of a function with no parameters, returning
     void. It is parsed and executed a single time.The optional LANGUAGE clause can be written either before 
     or after the code block.
     
--8 参考
http://www.postgresql.org/docs/9.2/static/sql-do.html
http://www.postgresql.org/docs/9.2/static/view-pg-tables.html
http://blog.163.com/digoal@126/blog/static/163877040201312241028667/


  评论这张
 
阅读(8286)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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