我们知道可以使用 function 来实现较复杂的业务逻辑,有时候在数据库维护过程中需要执行稍复杂点的维护,但又不想写 function ,这时可以使用 “do “命令了, 这里介绍 “do “命令执行代码段的用法。
在介绍 “do” 命令之前先来看一个函数:
函数 fun_ins_test_3()
1 2 3 4 5 6 7 8 9 10 11 12 13 14
CREATEorreplaceFUNCTION fun_ins_test_3() RETURNSINTEGERAS $$ DECLARE i INTEGER; BEGIN perform 1from pg_tables where schemaname = 'francs'and tablename = 'test_3'; if not found then createtable test_3(id int4); endif; for i in 1 .. 10000 loop insertinto test_3 values (i); endloop; return 1; END; $$ LANGUAGE 'plpgsql';
备注:函数代码非常简单,向一张表插入数据。
执行函数
1 2 3 4 5
francs=> select count(*) from test_3; count ------- 10000 (1 row)
备注:上面通过创建一个函数向表 test_3 中插入数据,有时觉得一个简单的操作不想再创建一个函数,这时就可以使用 do 命令执行代码断了,简单的说 do 命令的代码段就是没有入参并且返回值为空的函数的语句体,
使用 DO 命令
1 2 3 4 5 6 7 8 9 10 11 12 13
do $$ DECLARE i INTEGER; BEGIN perform 1from pg_tables where schemaname = 'francs'and tablename = 'test_3'; if not found then createtable test_3(id int4); endif; for i in 1 .. 10000 loop insertinto test_3 values (i); endloop; END; $$ LANGUAGE 'plpgsql';
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 脚本结合,在维护过程中非常有用,下面给个简单的例子。
[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
备注:$$ 符加需要转义,否则会报错。
测试
1 2
[pg92@redhatB tf]$ ./insert_test_03.sh DO
附: DO 命令语法
1 2 3 4 5 6 7 8 9 10 11
Name DO-- execute an anonymous code block Synopsis DO [ LANGUAGE lang_name ] code Description DO executes an anonymous code block, orin other words a transient anonymous functionin a procedural language.The code blockis treated as though it were the bodyof a functionwithnoparameters, returning void. It is parsed and executed a single time.The optional LANGUAGE clause can be written either before orafter the code block.