• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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;
    

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

    您可能感兴趣的文章:
    • 解决postgresql表中的字段名称包含特殊符号的问题
    • postgresql数据库使用说明_实现时间范围查询
    • postgresql 实现将数组变为行
    • PostgreSQL 对数组的遍历操作
    • postgresql 存储函数调用变量的3种方法小结
    • postgresql~*符号的含义及用法说明
    上一篇:postgresql 存储函数调用变量的3种方法小结
    下一篇:PostgreSQL 对数组的遍历操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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