PostgreSQL:使用 “do …” 命令执行代码段

我们知道可以使用 function 来实现较复杂的业务逻辑,有时候在数据库维护过程中需要执行稍复杂点的维护,但又不想写 function ,这时可以使用 “do “命令了, 这里介绍 “do “命令执行代码段的用法。

在介绍 “do” 命令之前先来看一个函数:

函数 fun_ins_test_3()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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';

备注:函数代码非常简单,向一张表插入数据。

执行函数

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 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';

执行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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 脚本结合,在维护过程中非常有用,下面给个简单的例子。

一个包含DO命令的 Shell 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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, 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.

参考

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

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

相关推荐

发表回复

登录后才能评论