pl/pgsql即Procedural Language/ Postgres SQL(过程化sql语言),是Postgresql数据库对sql语句的扩展,可以在pl/pgsql代码块内定义多条sql语句,每条语句以分号结束,代码块由begin开始,end结束,代码块的最后一个end可以不加分号。

DO关键字用来执行一段匿名代码块,即在在程序语言过程中一次性执行的匿名函数。代码块可以看做是一段没有参数、没有返回值的函数体。其格式如下:

DO [LANGUAGE lang_name] code;

code block代码块实际上为一个字符串,可以用”美元符引用” $$ 书写字符串常量, $$ 中间可以包含标签名,可以自由命名,但是不能以数字开头,可以命名为 $$,$_$,$a$,$a1$... ,该标签名必须成对出现,且大小写敏感。

用DECLARE声明变量(如果不需要声明变量可以不写declare),用BEGIN和END包括需要执行的代码/sql语句,每个语句末尾需要加上分号,BEGIN不加分号,代码块最后一个END后可以省略分号;其格式如下:

DO $body$
BEGIN
  update student set name = '张小明' where id = 10010;
$body$;
DO $body$
DECLARE
  NEW_NAME varchar(100);
BEGIN
  NEW_NAME:='张'||'小明';
  update student set name = NEW_NAME where id = 10010;
$body$;

lang_name

用来解析code的程序语言的名字,如果缺省,默认为plpgsql,lang_name可以写在code前,也可以写在code后,即

DO code;

等效于下边的

DO LANGUAGE PLPGSQL code;
DO code LANGUAGE PLPGSQL;

这里的code指的是代码块,也就是上边说的内容格式。

DO $body$
DECLARE
  SIZES_VALUE varchar(1000);
  MEASUREMENT_TEMPLATE RECORD;
BEGIN
  FOR MEASUREMENT_TEMPLATE IN (SELECT ID FROM CNT_MEASUREMENT_TEMPLATE WHERE DOMAIN_ID IN ('/','RD1','RD2') AND IS_LATEST = TRUE AND (SIZES IS NULL OR SIZES = ''))
      -------- split sizes value from CNT_MEASUREMENT_TEMPLATE_SIZE order by seq_no --------
      SIZES_VALUE = (SELECT ARRAY_TO_STRING(ARRAY(SELECT ALT_LABEL||CASE WHEN COALESCE(LABEL,'') = '' THEN '' ELSE '('||LABEL||')' END FROM CNT_MEASUREMENT_TEMPLATE_SIZE 
        WHERE PARENT_ID = MEASUREMENT_TEMPLATE.ID ORDER BY SEQ_NO),', '));
      -------- set sizes value for cnt_measurement_template whose sizes value is null or '' --------
      UPDATE CNT_MEASUREMENT_TEMPLATE SET SIZES = SIZES_VALUE WHERE ID = MEASUREMENT_TEMPLATE.ID;
    END LOOP;
END;
$body$ LANGUAGE PLPGSQL;

1. https://www.cnblogs.com/wangzhen3798/p/7630597.html
2. https://www.2cto.com/database/201505/399624.html

今天想在 Post ge SQL 数据库里建一个存储过程(或 函数 也行),由于对存储过程比较生疏,上网搜了很多教程和源代码例子,照着写,发现怎么都不行,甚至把网上教程包括官方教程的源代码原封不动的复制下来一执行都会报错, 教程示例: ---创建自定义 函数 sales_tax CREATE or re pl ace FUNCTION sales_tax(subtotal real) RETURNS real A... 关键字 是指在数据库中有意义的字,通常是数据库内部使用, 不能用于命名用户的数据对象。有的数据库还会详细划分,例如分为 关键字 ,候选字,甚至更详细的分类。分类的标准例如有的是绝对不可以使用,有的通过一定手段例如添加双引号可以使用。我们为了方便统一称之为 关键字 ,通常用户编写的对象中使用 关键字 会造成错误或不确定的影响,为了避免这个问题,用户应该避免使用数据库的 关键字 (含保留字或其他保留别名等)。这个系列主要整理了各大数据库的 关键字 ,可以用于建库,建表,写存储过程, 函数 等场景避免冲突。 Hypo PG 项目官方资源库已移至Hypo PG 组织。 不要忘记更新您的git remote! git remote set- Hypo PG Hypo PG PostgreSQL 扩展,增加了对假设索引的支持。 !!警告!! Hypo PG 项目官方资源库已移至Hypo PG 组织。 不要忘记更新您的git remote! git remote set-url origin [电子邮件保护]:hypo pg / hypo pg .git begin IF (select count(1) from information_schema.columns where table_schema = 'public' and table_name = 'user' and column_name = 'name') = 0 create table student( id int primary key not null, name text not null, 纯 PostgreSQL plpg sql 中的TOTP实现 此扩展提供了HMAC基于时间的一次性密码算法(TOTP),该方法在RFC 6238/4226中指定为纯 plpg sql 函数 。 SELECT totp . generate ( ' mysecret ' ); -- you can also specify totp_interval, and totp_length SELECT totp . generate ( ' mysecret ' , 30 , 6 ); 在这种情况下,生成长度为6的TOTP代码 013438 SELECT totp . verify ( ' mysecret ' , ' 765430 ' ); -- you can also specify totp_interval, and totp_length SELECT totp . ver PL / pg SQL 的控制结构是最重要及最有用的一部分了,在实际工作场景都离不开业务处理逻辑,在写 PL / pg SQL 时,利用控制结构来操作数据。 PL / pg SQL 支持的控制结构与其他语言几乎差不多,比如:条件、循环、异常等,下面就分别介绍控制结构的使用。 对于条件控制结构,支持IF与CASE两种,IF语句有如下三种写法: if ... then ... end if if ... then ... else ... end if if ... then ... elsif ... then ... el SELECTgetdatabaseencoding()INTOcoding; IFcoding='UTF8'THEN EXECUTE'CREATEORRE PL ACEFUNCTION pg _...