> 文章列表 > 【PostgreSQL】官网学习使用 PL/pgSQL编写造数据脚本

【PostgreSQL】官网学习使用 PL/pgSQL编写造数据脚本

【PostgreSQL】官网学习使用 PL/pgSQL编写造数据脚本

文章目录

    • 1. 前言
    • 2. 成果
    • 3. 创建与使用类似 Java map 的数据结构
      • 3.1 声明数组
      • 3.2 数组赋值
      • 3.3 数组遍历
    • 4. 如何打印调试信息 (可以用来生成回滚语句
    • 5. 后记

1. 前言

前段时间需要大量造数据,写Java程序做造数据的活感觉太笨重了,遂下班后学习了 PL/pgSQL 写脚本。公司用的是11.5的版本。按照 官网的Manual ,把下面的问题搞清楚,就能实现大部分的需求了,有其他经验的时候再来补充。

  • 如何声明、修改、删除一个函数
  • 如何在函数中声明与使用局部变量
  • 如何创建与使用类似 Java map 的数据结构
  • 如何使用循环等其他控制语句
  • 如何打印调试信息 (可以用来生成回滚语句)

2. 成果

  • 放个极简单的批量新增脚本
-- 批量插入
-- _configList 使用 “_” 前缀来标识变量,用于区分sql中的字段
CREATE OR REPLACE FUNCTION batchInsert(_configList varchar[][],  _main_id int) RETURNS void AS $$
DECLARE_config varchar[];_content varchar;_amount int;
BEGIN-- 获取二维数组的每个一维数组FOREACH _config SLICE 1 IN ARRAY (_configList) LOOP_content := _config[1];_amount  := _config[2];-- 把变量输出到控制台	RAISE NOTICE 'config = %, content = %, amount = % main_id = %', _config, _content, _amount, _main_id;-- 用变量拼接sql语句并且实际运行在server上INSERT INTO public.main_history (amount, content, main_id) VALUES (_amount, _content, _main_id);END LOOP;
END;
$$ LANGUAGE plpgsql;-- 使用函数
select batchInsert(ARRAY[['ccontent1', '1'], ['content2', '2']], 1);-- 删除函数
drop function batchInsert;

3. 创建与使用类似 Java map 的数据结构

创建高级的数据结构变量,官网这一块是缺失的,遂使用二维数组来实现需求。
PS: 数组相关的内容官网有很多,这里只记录与实现需求有关的用法。

3.1 声明数组

  • 声明的时候可以不额外区分一维、二维数组
    _configList varchar[][]_configList varchar[] 是一样的

3.2 数组赋值

  • 声明为varchar后,赋值时也要是varchar类型。
    	_configList varchar[][] := (ARRAY[['ccontent1', '1'], ['content2', '2']]);
    

3.3 数组遍历

  • 二维数组的遍历,官网提供语法:
    -- _configList 由外界传入, 值得一提的是 FOREACH  SLICE IN ARRAY 都是关键字
    FOREACH _config SLICE 1 IN ARRAY (_configList) LOOP_content := _config[1];_amount  := _config[2]; 
    END LOOP;
    

4. 如何打印调试信息 (可以用来生成回滚语句)

官网 Manual 讲的足够详细了。这里有启发的地方在于生成回滚语句。之前记录过 一些小技巧。

5. 后记

后续看官网发现 PostgreSQL 能够直接集成 Python,集成后可以直接用Python的语法写脚本。如:

CREATE FUNCTION pymax (a integer, b integer)RETURNS integer
AS $$if a > b:return areturn b
$$ LANGUAGE plpythonu;

又多了个动机学Python了~