PostgreSQL存储过程循环调用方式

需求描述

碰到需求,需要往表里插入5万条数据, 打算使用存储过程,但是postgres 数据库没有建存储过程的SQL, 所以使用函数来实现.

表数据结构完整性要求一次插入两条记录, 两条记录相互外键约束, record1 的 partner_id 字段值是 record2 的主键id的值, record2 的 partner_id 字段值是 record1 的主键id的值.

实现

create
 or replace function creatData() returns boolean as $BODY$
declare ii integer;
declare id1 integer;
declare id2 integer;
begin
 ii = 1;
 id1 = nextval('seq_table');
 id2 = nextval('seq_table');
FOR ii IN 1..50000 LOOP
insert
 into
 table1
 values(
 id1,
 10,
 10250,
 5001,
 '2017-08-07 14:00:00',
 '2017-08-07 15:00:00',
 id2,
 true,
 864,
 16950,
 0,
 0,
 0,
 null,
 20,
 null,
 18050,
 '2017-08-07 13:55:08',
 18051,
 '2017-08-07 13:57:28',
 false,
 401,
 10,
 null,
 null,
 null,
 'DA-HZ001000003',
 '2017-08-07 13:54:08',
 '2017-08-07 13:57:28',
 10251
 );
insert
 into
 table1
 values(
 id2,
 10,
 10251,
 5001,
 '2017-08-07 14:00:00',
 '2017-08-07 15:00:00',
 id1,
 true,
 864,
 16950,
 0,
 0,
 0,
 null,
 20,
 null,
 18050,
 '2017-08-07 13:55:08',
 18051,
 '2017-08-07 13:57:28',
 false,
 401,
 10,
 null,
 null,
 null,
 'DA-HZ001000003',
 '2017-08-07 13:54:08',
 '2017-08-07 13:57:28',
 10250
);
end LOOP;
return true;
end;
$BODY$ LANGUAGE plpgsql;

问题

这样子插入只能插入一次, 因为取得序列值的地方在for循环的外面, id的值不会随着循环再赋值, 主键冲突.

办法

想到可以再对函数进行循环, 于是再写一个函数循环执行上一个函数, 去掉上个函数中的for 循环语句FOR i IN 1..500000 LOOP 和 end LOOP;

再写一个下面函数循环执行函数1

create or replace function loopCreate()
returns void as
$BODY$
 begin for i in 1..50000 LOOP
 PERFORM creatData();
 end LOOP;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

执行函数

select * from loopCreate() as tab;

好了,完成,10万条数数据秒插, 2.1秒.

PS:CSDN的markdown编辑器真的很难用, 文字稍微长一点就卡, 而且换行经常自动调跳回上一行, 无奈, 现在都是直接在别的地方写好粘贴回来…

补充:postgresql 存储过程中遍历的一个小问题

问题

想实现这种功能,就是 for r in 后面的sql语句是一个变量,要把以下代码修改一下

"sqltext" = 'select "ID","ZONENAME" from "ZONE_INFO" where "ID"<>0';
 for r in "sqltext"
loop
return next r;
end loop; 

解决方法:

sqltext = 'select "ID","ZONENAME" from "ZONE_INFO" where "ID" <>0';
for r in execute sqltext
loop
 return next r;
end loop;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Postgresql 存储过程(plpgsql)两层for循环的操作

    项目中遇到测试,需要造4500数据,而且需要分部门和日期,一个部门一天30条数据,剩下的铺垫数据可以一个部门一天100w左右数据,这里,每次变换部门,日期,需要操作至少300次,想到用存储过程写一个函数进行 首先,了解存储过程的语法: CREATE [ OR REPLACE ] FUNCTION name( [ [argmode] [argname]argtype[ { DEFAULT | = }default_expr] [, ...] ] ) [ RETURNSrettype | RETUR

  • postgresql 存储函数调用变量的3种方法小结

    一.假设有表student,字段分别有id,remark,name等字段. 二.写一个存储函数,根据传过去的变量ID更新remark的内容. 调用该存储函数格式如下: select update_student(1); 三.存储函数示例如下: CREATE OR REPLACE FUNCTION public.update_student(id integer) RETURNS text AS $BODY$ declare sql_str_run text; BEGIN /* --method

  • PostgreSQL 如何修改文本类型字段的存储方式

    PostgreSQL存储方式分为以下4种: PLAIN避免压缩或者线外存储:而且它禁用变长类型的单字节头部.这是不可TOAST数据类型列的唯一可能的策略.只是对那些不能TOAST的数据类型才有可能. EXTENDED允许压缩和线外存储.这是大多数可TOAST数据类型的默认策略. 首先将尝试进行压缩,如果行仍然太大,那么则进行线外存储. EXTERNAL允许线外存储,但是不许压缩.使用EXTERNAL将令那些在宽text和 bytea列上的子串操作更快(代价是增加了存储空间), 因此这些操作被优化

  • PostgreSQL存储过程用法实战详解

    本文实例讲述了postgreSQL存储过程用法.分享给大家供大家参考,具体如下: 转了N多的SQL语句,可是自己用时,却到处是坑啊,啊,啊!!!!!!!!!!!!!!! 想写一个获取表中最新ID值. 上代码 CREATE TABLE department( ID INT PRIMARY KEY NOT NULL, d_code VARCHAR(50), d_name VARCHAR(50) NOT NULL, d_parentID INT NOT NULL DEFAULT 0 ); --inse

  • 修改postgresql存储目录的操作方式

    修改postgresql存储目录: sudo rsync -av /var/opt/gitlab/postgresql /data/gitlab/ 修改 /etc/gitlab/gitlab.rb postgresql['data_dir'] = "/data/gitlab/postgresql/data" postgresql['dir'] = "/data/gitlab/postgresql" postgresql['home'] = "/data/g

  • PostgreSQL存储过程循环调用方式

    需求描述 碰到需求,需要往表里插入5万条数据, 打算使用存储过程,但是postgres 数据库没有建存储过程的SQL, 所以使用函数来实现. 表数据结构完整性要求一次插入两条记录, 两条记录相互外键约束, record1 的 partner_id 字段值是 record2 的主键id的值, record2 的 partner_id 字段值是 record1 的主键id的值. 实现 create or replace function creatData() returns boolean as

  • Mybatis调用PostgreSQL存储过程实现数组入参传递

    前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于PostgreSQL自带数组类型,所以有一个自定义函数的入参就是一个int数组,形如: 复制代码 代码如下: CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4)... 如上所示,参数是一个int数组,Mybatis提供了对调用存储过程的支持,那么PostgreSQL独有的数组类型作为存储过程的参数又

  • 浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序

    在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Literals): var fnMethodName = function(x){alert(x);} Function()构造函数: var fnMethodName = new Function('x','alert(x);') // 由Function构造函数的参数个数可变.最后一个参数写函数体

  • Oracle报存储过程中调用DBLink同义词出现错误:PLS-00201: 必须声明标识符

    前几天编写一个存储过程,需要访问远程数据库的字段,于是建立一个dbLink并建了同义词: CREATE PUBLIC DATABASE LINK orcl@dbc CONNECT TO orcl IDENTIFIED BY orcl USING 'orcl'; CREATE SYNONYM mtb FOR mytable@orcl@dbc: 这里之所以用orcl@bdc为dblink的名称是为了设置global_names=true. 然后新建一个存储过程调用该同义词: v_result mtb

  • shell中循环调用hive sql 脚本的方法

    脚本tt.sh的内容如下: #!/bin/bash params=$1 for param in $params do echo $param done 运行方式为:sh tt.sh "1 2 3 4 5" 输出为: 1 2 3 4 5 所以参考上面的命令,可以把hql的脚本写为如下方式,就可以循环执行sql: 功能:查找字符串 comments 中的param第一次出现的位置 ,返回的是位置数字 #!/bin/bash params=$1 for param in $params d

  • Java HashMap三种循环遍历方式及其性能对比实例分析

    本文实例讲述了Java HashMap三种循环遍历方式及其性能对比.分享给大家供大家参考,具体如下: HashMap的三种遍历方式 (1)for each map.entrySet() Map<String, String> map = new HashMap<String, String>(); for (Entry<String, String> entry : map.entrySet()) { entry.getKey(); entry.getValue();

  • postgresql 性能参数配置方式

    查询Linux服务器配置 在进行性能调优之前,需要清楚知道服务器的配置信息,比如说 CPU,内存,服务器版本等信息. 查询系统版本信息 root@ubuntu160:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.3 LTS Release: 14.04 Codename: trusty Linux查看物理CPU个数.核数.逻辑CPU个数 # 总核数

  • MySql存储过程循环的使用分析详解

    目录 简介 场景描述 解决方案 案例 总结 简介 每一门数据库语言语法都基本相似,但是对于他们各自的一些特性(函数.存储过程等)的用法就不大相同了,就好比Oracle与Mysql存储过程写起来就很多不同的地方,在这里主要是跟大家分享一下MySql存储过程中使用游标循环的处理方法. 场景描述 我们举一个简单的场景,首先我们可能会有这样一种情况,考试成绩表(t_achievement)有一堆的sql脚本处理,需要依赖另一个学生表(t_student)数据对部分学生做考试成绩汇总记录到成绩汇总表(t_

  • javascript 循环调用示例介绍

    复制代码 代码如下: function checksdzt(){ sdzt = $("#viewObj_zt_text").val(); //循环调用,如果已经获取到了结果,则退出循环 loopgetinfo = setInterval("checksdztsub()",50); //这里循环调用,间隔50毫秒 } function checksdztsub(){ if ($("#viewObj_zt_text").val() !="&

随机推荐