美文网首页
postgresql存储过程代码编写

postgresql存储过程代码编写

作者: 夏2018 | 来源:发表于2019-10-31 13:48 被阅读0次
  • 背景

公司最近有个项目数据库里表需要使用到另外一个数据库里表的某两个字段,而且并不是直接查询就能插入到新表里

  • 旧表
id sn customer
1 xxxx Test
  • 新表
id sn customer_id
1 xxxx 1
id customer
1 Test
我开始考虑的是使用python脚本去查数据库,然后逻辑判断,这种方式也是可以实现的。
进行插入但表里的数据有几百万条记录,使用python脚本迁移,有网络的开销,执行的速度会很慢,
所以我考使用postgresql的存储过程进行迁移

思路:在新库创建schema,然后将旧表导入schema里,
然后再存储过程脚本里查询schema里的旧表,在插入新表逻辑时进行查询判断,然后将记录插入到新表里
vim bossToAd.sql

创建迁移脚本bossToAd.sql文件,以下为代码内容


CREATE OR REPLACE FUNCTION bossToadfunc ()
RETURNS integer AS $$
declare
    row RECORD;
    sn_v varchar;
    customer_v varchar;
    ids RECORD;
    c_id integer := 0;
    count integer :=0;
BEGIN
        FOR row IN SELECT sn,customer FROM boss_tmp.t_terminal LOOP
                count := count + 1;
                sn_v := row.sn;
                customer_v := row.customer;
                EXECUTE 'select id from t_customer where customer_name='||quote_literal(customer_v) into ids;
                IF ids IS NULL THEN
                        EXECUTE 'insert into t_customer (customer_name) VALUES ('||
                        quote_literal(customer_v)||') RETURNING id' INTO ids;
                        c_id = ids.id;
                ELSE
                        c_id = ids.id;
                        
                END IF;
                EXECUTE 'insert into t_sn (sn_value,customer_id) VALUES ('
                        ||quote_literal(sn_v)||','||
                        quote_literal(c_id)||') on conflict(sn_value) do update set customer_id='
                        ||quote_literal(c_id);

        END LOOP;
return count;
END;
$$ LANGUAGE plpgsql;
select bossToadfunc();

导出boss数据库的t_terminal表

pg_dump -h 192.168.10.201 -p 23451 -U postgres -t t_terminal -d boss > boss.sql
sed -i 's/^SET search_path = public, pg_catalog;$/SET search_path = boss_tmp, pg_catalog;/' boss.sql

创建名为boss_tmp的schema
登录adserver数据库后执行创建schema
su postgres
psql -p 23451 -h 192.168.10.202 -U postgres -d adserver
create schema boss_tmp;

\q 退出数据库输入端

导入数据
psql -p 23451 -h 192.168.10.202 -U postgres -d adserver < boss.sql
重新登录adserver
psql -p 23451 -h 192.168.10.202 -U postgres -d adserver

\i bossToAd.sql

相关文章

  • postgresql存储过程代码编写

    背景 公司最近有个项目数据库里表需要使用到另外一个数据库里表的某两个字段,而且并不是直接查询就能插入到新表里 旧表 新表

  • 09-存储过程

    一、编写存储过程 t_emp存储过程 二、调用存储过程

  • POSTGRESQL 存储过程实战

    转了N多的SQL语句,可是自己用时,却到处是坑啊,啊,啊!!!!!!!!!!!!!!! 想写一个获取表中最新ID值...

  • 开发日记:Orcale 存储过程(一)

    由于项目中用到存储过程,这两天把存储过程方面的知识简单回顾了一下并分享给大家。 编写第一个存储过程 上述代码实现的...

  • PostgreSQL Oracle 兼容性之存储过程

     在oracle中,函数和存储过程是经常使用到的,并且有所区别;而postgresql中函数和存储过程都是相同定义...

  • 新手编写存储过程入门

    存储过程的 概念: 存储过程:就是一块PLSQL语句包装起来,起个名称 语法上:相当于plsql语句戴个帽子。 相...

  • datagrips oracle编写存储过程

    变量 普通变量 定义方式:变量名 类型(长度); 普通变量类型的赋值方式有两种:1、通过 := 直接赋值;2、通过...

  • 如何理解postgresql的存储过程

    在b/s系统的构建过程中,数据库操作几乎成为了一个必不可少的操作。调用存储过程实现数据库操作使很多程序员使用的方法...

  • SQL优化(四) PostgreSQL存储过程

    原创文章,首发自作者个人博客Jason's Blog。转载请务必在文章开头处注明出自Jason's Blog,并给...

  • postgresql存储过程--return table/row

      目前有将自己自学的sql知识传输给他人工作计划,虽然总感觉sql是一门相对简单的语言,但是在日常知识共享过程中...

网友评论

      本文标题:postgresql存储过程代码编写

      本文链接:https://www.haomeiwen.com/subject/mkftbctx.html