作者
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 - 公益是一辈子的事.





