暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL psql 客户端一些妙用 - gexec 执行 SQL返回的结果

digoal 2021-01-01
1040

作者

digoal

日期

2021-01-21

标签

PostgreSQL , SQL , psql , 动态sql


背景

《PostgreSQL psql的元素周期表 - 包括大对象操作》

如果我们想用动态sql拼出一些sql结果, 并执行这些sql,
一般有两种方法,
1、使用psql客户端的gexec命令

```
postgres=> SELECT format('CREATE TABLE %I partition OF test_ranged FOR VALUES FROM (%s) to (%s);', 'test_ranged_' || i, i, i+1)
postgres-> FROM generate_series(1,10000) i
postgres-> ;
format


CREATE TABLE test_ranged_1 partition OF test_ranged FOR VALUES FROM (1) to (2);
CREATE TABLE test_ranged_2 partition OF test_ranged FOR VALUES FROM (2) to (3);
CREATE TABLE test_ranged_3 partition OF test_ranged FOR VALUES FROM (3) to (4);
CREATE TABLE test_ranged_4 partition OF test_ranged FOR VALUES FROM (4) to (5);
```

```
\gexec 代替 ; (分号) 结束这条SQL, 就是执行这条SQL的查询结果.

CREATE TABLE test_ranged (
id serial PRIMARY KEY,
payload TEXT
) partition BY range (id);

SELECT format('CREATE TABLE %I partition OF test_ranged FOR VALUES FROM (%s) to (%s);', 'test_ranged_' || i, i, i+1)
FROM generate_series(1,10000) i
\gexec

-- 创建1万个分区
```

2、使用do inline code

```
-- 以上例子, 使用inline code实现

CREATE TABLE test_ranged (
id serial PRIMARY KEY,
payload TEXT
) partition BY range (id);

do language plpgsql $$
declare
begin
for i in 1..10000
loop
execute format('CREATE TABLE %I partition OF test_ranged FOR VALUES FROM (%s) to (%s);',
'test_ranged_' || i,
i,
i+1);
end loop;
end;
$$;
```

PostgreSQL 许愿链接

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.

9.9元购买3个月阿里云RDS PostgreSQL实例

PostgreSQL 解决方案集合

德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat

文章转载自digoal,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论