【原创】PostgreSQL 遍历表的PLSQL列举
发布时间:2020-12-13 17:30:24 所属栏目:百科 来源:网络整理
导读:我们经常会对数据字典中的系统表进行遍历,从而写一些SHELL脚本或者动态造数据等等。 这里我用PLSQL演示了三种方法来遍历一张表。 表结构如下, t_girl=# d tmp_1; Unlogged table "public.tmp_1" Column | Type | Modifiers----------+-------------------
|
我们经常会对数据字典中的系统表进行遍历,从而写一些SHELL脚本或者动态造数据等等。 这里我用PLSQL演示了三种方法来遍历一张表。 表结构如下, t_girl=# d tmp_1;
Unlogged table "public.tmp_1"
Column | Type | Modifiers
----------+-----------------------------+-----------
id | integer |
log_time | timestamp without time zone |
在这里我创建里一个自定义类型来保存我的函数返回值。 create type ytt_record as (id int,log_time timestamp without time zone); 现在来看第一个函数。 也是用最笨的方法来遍历。 create or replace function sp_test_record1(
IN f_id int
) returns setof ytt_record as
$ytt$
declare i int;
declare cnt int;
declare o_out ytt_record;
begin
i := 0;
cnt := 0;
select count(*) into cnt from tmp_1 where id > f_id;
while i < cnt
loop
select id,log_time into strict o_out from tmp_1 where id > f_id order by log_time desc limit 1 offset i;
i := i + 1;
return next o_out;
end loop;
end;
$ytt$ language plpgsql;
我们来执行下结果,花费了3毫秒左右。 t_girl=# select * from sp_test_record1(60); id | log_time ----+---------------------------- 85 | 2014-01-11 17:52:11.696354 73 | 2014-01-09 17:52:11.696354 77 | 2014-01-04 17:52:11.696354 80 | 2014-01-03 17:52:11.696354 76 | 2014-01-02 17:52:11.696354 65 | 2013-12-31 17:52:11.696354 80 | 2013-12-30 17:52:11.098336 85 | 2013-12-27 17:52:11.098336 97 | 2013-12-26 17:52:11.696354 94 | 2013-12-24 17:52:09.321394 (10 rows) Time: 3.338 ms 现在来看第二个函数,这个就比较优化了, 用了系统自带的循环遍历结构。 create or replace function sp_test_record2(
IN f_id int
) returns setof ytt_record as
$ytt$
declare o_out ytt_record;
begin
for o_out in select id,log_time from tmp_1 where id > f_id order by log_time desc
loop
return next o_out;
end loop;
end;
$ytt$ language plpgsql;
这次运行结果看看,时间不到1毫秒。 t_girl=# select * from sp_test_record2(60); id | log_time ----+---------------------------- 85 | 2014-01-11 17:52:11.696354 73 | 2014-01-09 17:52:11.696354 77 | 2014-01-04 17:52:11.696354 80 | 2014-01-03 17:52:11.696354 76 | 2014-01-02 17:52:11.696354 65 | 2013-12-31 17:52:11.696354 80 | 2013-12-30 17:52:11.098336 85 | 2013-12-27 17:52:11.098336 97 | 2013-12-26 17:52:11.696354 94 | 2013-12-24 17:52:09.321394 (10 rows) Time: 0.660 ms 最后一个函数, 利用RETURN QUERY 直接返回结果集。 create or replace function sp_test_record3( IN f_id int ) returns setof ytt_record as $ytt$ begin return query select id,log_time from tmp_1 where id > f_id order by log_time desc ; end; $ytt$ language plpgsql; 这个结果其实等同于直接从表SELECT,响应时间和第二个差不多。 t_girl=# select sp_test_record3(60);
sp_test_record3
-----------------------------------
(85,"2014-01-11 17:52:11.696354")
(73,"2014-01-09 17:52:11.696354")
(77,"2014-01-04 17:52:11.696354")
(80,"2014-01-03 17:52:11.696354")
(76,"2014-01-02 17:52:11.696354")
(65,"2013-12-31 17:52:11.696354")
(80,"2013-12-30 17:52:11.098336")
(85,"2013-12-27 17:52:11.098336")
(97,"2013-12-26 17:52:11.696354")
(94,"2013-12-24 17:52:09.321394")
(10 rows)
Time: 0.877 ms
t_girl=#
本文出自 “上帝,咱们不见不散!” 博客,请务必保留此出处http://www.52php.cn/article/p-febgcqik-bs.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
