PostgreSQL笔记-pl/pgsql的DO关键字_postgres $do$;_雨临Lewis的博客-程序员宅基地

技术标签: postgresql  函数  plpgsql  数据库  

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

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

DO [LANGUAGE lang_name] code;

code

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

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

DO $body$
BEGIN
  update student set name = '张小明' where id = 10010;
END
$body$;
DO $body$
DECLARE
  NEW_NAME varchar(100);
BEGIN
  NEW_NAME:='张'||'小明';
  update student set name = NEW_NAME where id = 10010;
END
$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 = ''))
    LOOP
      -------- 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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lewky_liu/article/details/79352220

智能推荐

OSChina 周一乱弹 —— 今天下班带你去放松咧-程序员宅基地

2019独角兽企业重金招聘Python工程师标准>>> ...

uni-app开发工具: HBuilderX_uniapp开发工具_iOS逆向的博客-程序员宅基地

引言HBuliderX 开发版:https://www.dcloud.io/hbuilderx.html微信小程序开发工具:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.htmlServerless WordPress 建站https://kunnan.blog.csdn.net/article/details/120020130I HBuliderX的使用1.1 HBuliderX的运行_uniapp开发工具

如何打造一个让人愉快的框架-程序员宅基地

原文链接这是我在今年 1 月 10 日 @Swift 开发者大会 上演讲的文字稿。相关的视频还在制作中,没有到现场的朋友可以通过这个文字稿了解到这个 session 的内容。虽然我的工作是程序员,但是最近半年其实我的主要干的事儿是养了一个小孩。 所以这半年来可以说没有积累到什么技术,反而是积累了不少养小孩的心得。 当知道了有这么次会议可以分享这半年来的心得的

Android 进阶-程序员宅基地

一.基础: Android生命周期 四大组件二.深入知识: AIDL Binder 多进程 View的绘制流程 事件分发 消息队列三.核心机制

可观测告警运维系统调研——SLS告警与多款方案对比_阿里云sls aws_阿里云云栖号的博客-程序员宅基地

简介: 本文介绍对比多款告警监控运维平台方案,覆盖阿里云SLS、Azure、AWS、自建系统(ELK、Prometheus、TICK)等方案。前言本篇是SLS新版告警系列宣传与培训的第三篇,后续我们会推出20+系列直播与实战培训视频,敬请关注。系列目录(持续更新)一站式云原生智能告警运维平台——SLS新版告警发布! 这才是可观测告警运维平台——20个SLS告警运维场景 可观测告警运维系统调研——SLS告警与多款方案对比(本篇)1. 什么是SLS告警运维系统1.1. SL.._阿里云sls aws

ArrayList的addAll 与 for循环比较_for循环add快还是addall快-程序员宅基地

采摘处:http://blog.csdn.net/sutaizi/article/details/6607123问题是这样产生的,网上一哥们发了一个面试题:ListA 里面有 1 2 3 ListB里面有 4 5 6 让ListA变成 1 2 3 4 5 6 我觉得很简单 ,就说用for循环遍历 添加就好了。结果_for循环add快还是addall快

随便推点

【数据结构与算法 00】二分插入排序-程序员宅基地

算法思想从小到大排序N1:遍历数组 array[10000], i 为数组坐标,从1开始N2:以 i 为基数 tmpV=array[i],[0 ,i-1] 为区间坐标,(0+i-1)/2 为 mid 坐标N3:比较 tmpV 与 array[mid],如果大于,则区间为 [mid+1,i-1],否则为[0,mid-1]N4:遍历所有 i 实现以上递归步骤,直到 右坐标l

定时器源代码C语言_c定时器源码-程序员宅基地

源代码:/*snmp_alarm.c*/#include <stdio.h>#include <unistd.h>#include <signal.h>#include <stdlib.h>#include <sys/types.h>#include <netinet/in.h>#include <str..._c定时器源码

iOS技术点_ioshai-程序员宅基地

Images.xcassets文件夹硬盘区存放静态图片资源SupportingFiles->images文件夹硬盘区存放静态图片资源以太网走有线渠道/Wifi走无线渠道argv列表实例(带字符元素)——————————————————————————————Safari搜索框相当于驱动openURL指令(这就意味着通过指令来实现对app应用程序的驱动访问则app应用程序应该配置UR..._ioshai

C#和JS交互 WebBrowser实例-程序员宅基地

本文实现了WebBrowser的简单例子1.引用System.Windows.Froms.dll 2.引用WindowsFormsIntegration.dll 代码如下: publicpartialclassMainWindow:Window{publicMainWindow()...

scala的模式匹配和样例类_yui hatano-程序员宅基地

Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。一、字符串匹配import scala.util.Randomobject CaseDemo01 extends App{ val arr = Array("YoshizawaAkiho", "YuiHatano",_yui hatano

在Windows上使用EDA软件——利用WSL安装IC618、SPECTRE181_RZdarkness的博客-程序员宅基地

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、安装WSL1.启用适用于 Linux 的 Windows 子系统2.安装所选的 Linux 分发3.检查WSL版本二、安装前准备1.将WSL迁移到其他盘2.更换源3.安装图形界面3.1 Windows中的操作3.2 WSL中的操作4.修改PATH5.安装必要依赖三、安装总结前言由于各种各样的原因,很多同学都在自己的Windows机器上安装一个Linux虚拟机进行一些IC设计。但是虚拟磁盘空间只增不减,导致同学们的虚拟._spectre181