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

 更新时间:2021年01月16日 17:03:05   作者:snowwang928  
这篇文章主要介绍了Postgresql 存储过程(plpgsql)两层for循环的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

项目中遇到测试,需要造4500数据,而且需要分部门和日期,一个部门一天30条数据,剩下的铺垫数据可以一个部门一天100w左右数据,这里,每次变换部门,日期,需要操作至少300次,想到用存储过程写一个函数进行

首先,了解存储过程的语法:

CREATE [ OR REPLACE ] FUNCTION
  name( [ [argmode] [argname]argtype[ { DEFAULT | = }default_expr] [, ...] ] )
    [ RETURNSrettype
     | RETURNS TABLE (column_namecolumn_type[, ...] ) ]
  { LANGUAGElang_name
    | WINDOW
| IMMUTABLE | STABLE | VOLATILE
    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | COSTexecution_cost
    | ROWSresult_rows
    | SETconfiguration_parameter{ TOvalue| =value| FROM CURRENT }
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
  } ...
    [ WITH (attribute[, ...] ) ]
————————————————

CREATE [ OR REPLACE ] FUNCTION--创建一个函数,若有此函数,即取代重新创建 name -------函数名称

RETURNS---函数返回类型

具体的函数声明,请参考[postgresql存储过程]

下面说我写的函数:

CREATE OR REPLACE FUNCTION "xue"."insert_into_table"()
 RETURNS "pg_catalog"."void" AS $BODY$
DECLARE tmp VARCHAR(1024);
DECLARE n integer;
DECLARE i integer;
DECLARE inst_seq_no CURSOR FOR
  SELECT inst_seq_no FROM t where no in (
  '111','22','223','33','4358',
   '233','449','315','35335');
BEGIN
  RAISE NOTICE '------------start----------';
  i := 30;
  FOR stmt IN no LOOP
    n := 30;
    FOR n IN n..i LOOP    
      insert into test2 (NO,
      test_NO,TIME,USER_NO,SEQ_NO,
      NAME,USER_NO1,USER_NAME,CODE,USER_NO2,OPROR_NAME,
      REVIEW_TIME,DESC,
      VAL1,VAL2,DATE,UPD_TIME,DEL_FLAG) values
      (nextval('seq_test2'),n,'20190910',n,stmt.seq_no,n,n,n,n,n,n,'20190910','01','',n,n,'20190910',
      '20190909','0');
      END LOOP;
       n = n+30;
      i = i+30;
  END LOOP;
  RAISE NOTICE '-----------finished---------';
END;
$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100`

很简单的逻辑,但是在修改了三四遍才实现,这个第二次写存储过程,很多语法不是很熟悉,要注意的如:

1.`变量声明要用DECLARE

2.``游标 CURSOR 的用法

3.for循环要在begin中执行,

4.循环中要用“:=”

补充:Postgresql中存储过程(函数)调用存储过程(函数)时应用注意的问题

在postgresql中我们在执行存储过程中往往会使用select 存储过程,但是如果存储过程中再调用 存储过程时,就不能这样用了,应该用perform 存储过程,可以去参考官方文档的说明

执行一个没有结果的表达式或者命令

有时候我们希望计算一个表达式或者一个命令,但是却丢弃其结果(通常因为我们经常调用一些存在有用的副作用但是不存在有用结果值的函数)。 要在 PL/pgSQL 里干这件事, 你可以使用PERFORM语句:

PERFORM query;

这条语句执行一个 query并且丢弃结果。 query 的写法和你平常写 SQL SELECT 命令是一样的, 只是把开头的关键字 SELECT 替换成 PERFORM。 PL/pgSQL 的变量和平常一样代换到命令中。 同样,如果命令生成至少一行,那么特殊的变量 FOUND 设置为真,如果没有生成行,则为假。

注意: 我们可能希望没有INTO子句的SELECT也能满足这样的需要, 但是目前可以接受的唯一的方法是PERFORM。

一个例子:

PERFORM create_mv('cs_session_page_requests_mv', my_query);

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

相关文章

  • Postgresql数据库中的json类型字段使用示例详解

    Postgresql数据库中的json类型字段使用示例详解

    JSON的主要用于在服务器与web应用之间传输数据,这篇文章主要介绍了Postgresql数据库中的json类型字段使用,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • 解决sqoop import 导入到hive后数据量变多的问题

    解决sqoop import 导入到hive后数据量变多的问题

    这篇文章主要介绍了解决sqoop import 导入到hive后数据量变多的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 基于postgresql数据库锁表问题的解决

    基于postgresql数据库锁表问题的解决

    这篇文章主要介绍了基于postgresql数据库锁表问题的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • postgresql 修改字段长度的操作

    postgresql 修改字段长度的操作

    这篇文章主要介绍了postgresql 修改字段长度的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL之分区表(partitioning)

    PostgreSQL之分区表(partitioning)

    通过合理的设计,可以将选择一定的规则,将大表切分多个不重不漏的子表,这就是传说中的partitioning。比如,我们可以按时间切分,每天一张子表,比如我们可以按照某其他字段分割,总之了就是化整为零,提高查询的效能
    2016-11-11
  • PostgreSQL pg_ctl start启动超时实例分析

    PostgreSQL pg_ctl start启动超时实例分析

    这篇文章主要给大家介绍了关于PostgreSQL pg_ctl start启动超时的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • PostgreSQL教程(十五):系统表详解

    PostgreSQL教程(十五):系统表详解

    这篇文章主要介绍了PostgreSQL教程(十五):系统表详解,本文讲解了pg_class、pg_attribute、pg_attrdef、pg_authid、pg_auth_members、pg_constraint、pg_tablespace、pg_namespace、pg_database等表的作用和字段介绍,需要的朋友可以参考下
    2015-05-05
  • Postgresql数据库角色创建登录详解

    Postgresql数据库角色创建登录详解

    这篇文章主要为大家介绍了Postgresql数据库角色创建登录详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Postgresql psql文件执行与批处理多个sql文件操作

    Postgresql psql文件执行与批处理多个sql文件操作

    这篇文章主要介绍了Postgresql psql文件执行与批处理多个sql文件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL upsert(插入更新)数据的操作详解

    PostgreSQL upsert(插入更新)数据的操作详解

    这篇文章主要介绍了PostgreSQL upsert(插入更新)教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01

最新评论