首页 > 数据库 >Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句

Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句

时间:2023-12-19 17:45:17浏览次数:46  
标签:语句 CASE NOTICE Postgresql RAISE BEGIN END name

场景

PostGresSQL简介与Windows上的安装教程:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/113981563

除了标准 SQL 语句之外,PostgreSQL 还支持使用各种过程语言(例如 PL/pgSQL、C、PL/Tcl、PL/Python、PL/Perl、PL/Java 等 )

创建复杂的过程和函数,称为存储过程(Stored Procedure)和自定义函数(User-Defined Function)。

存储过程支持许多过程元素,例如控制结构、循环和复杂的计算。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

1、PL/pgSQL 代码块结构

[ <<label>> ]
[ DECLARE
 declarations ]
BEGIN
 statements;
 ...
END [ label ];

结构说明:

label 是一个可选的代码块标签,可以用于 EXIT 语句退出指定的代码块,或者限定变量的名称;

DECLARE 是一个可选的声明部分,用于定义变量;

BEGIN 和 END 之间是代码主体,也就是主要的功能代码;所有的语句都使用分号(;)结束,

END 之后的分号表示代码块结束。

代码块示例:

DO $$
DECLARE
 name text;
BEGIN
 name := '霸道';
 RAISE NOTICE 'Hello % !', name;
END $$;

运行结果:

 

示例说明:

以上是一个匿名块,与此相对的是命名块(也就是存储过程和函数)。

其中,DO 语句用于执行匿名块;我们定义了一个字符串变量 name,然后给它赋值并输出一个信息;

RAISE NOTICE用于输出通知消息。

$$用于替换单引号('),因为 PL/pgSQL 代码主体必须是字符串文本,意味着代码中所有的单引号都必须转义(重复写两次),

显然这种写法很不方便,因此 PL/pgSQL 提供了$$避免单引号问题。

2、嵌套子块

PL/pgSQL 支持代码块的嵌套,也就是将一个代码块嵌入其他代码块的主体中。被嵌套的代码块被称为子块(subblock),

包含子块的代码块被称为外部块(subblock)。子块可以将代码进行逻辑上的拆分,子块中可以定义与外部块重名的变量,

而且在子块内拥有更高的优先级。

示例代码:

DO $$
<<outer_block>>
DECLARE
 name text;
BEGIN
 name := 'outer_block';
 RAISE NOTICE 'This is %', name;
 DECLARE
 name text := 'sub_block';
 BEGIN
 RAISE NOTICE 'This is %', name;
 RAISE NOTICE 'The name FROM the outer block is %', outer_block.name;
 END;
 RAISE NOTICE 'This is %', name;
 
END outer_block $$;

执行结果:

 

3、声明与赋值

声明变量

variable_name data_type [ NOT NULL ] [ { DEFAULT | := |= } expression ];

variable_name 是变量的名称,通常需要指定一个有意义的名称;

data_type 是变量的类型,可以是任何 SQL 数据类型;

如果指定了 NOT NULL,必须使用后面的表达式为变量指定初始值。

变量声明示例:

DO $$
DECLARE
 name text;
 age numeric(5) DEFAULT 20;
 url varchar := 'www.123.com';
BEGIN
 name := '霸道';
 RAISE NOTICE 'age= %', age;
 RAISE NOTICE 'url= %', url;
END $$;

除了基本的 SQL 数据类型之外,PL/pgSQL 还支持基于表的字段或行或者其他变量定义变量,这里不再实现。

 

声明常量

如果在定义变量时指定了 CONSTANT 关键字,意味着定义的是常量。常量的值需要在声明时初始化,并且不能修改。

示例代码:

通过定义PI计算圆的面积

DO $$
DECLARE
 PI CONSTANT NUMERIC := 3.14159265;
 radius NUMERIC;
BEGIN
 radius := 5.0;
 RAISE NOTICE 'The area is %', PI * radius * radius;
END $$;

示例运行结果:

 

4、控制结构

IF语句

PL/pgSQL 提供了三种形式的 IF 语句

• IF … THEN … END IF
• IF … THEN … ELSE … END IF
• IF … THEN … ELSIF … THEN … ELSE … END IF

示例代码:

DO $$ DECLARE
i INTEGER := 3;
j INTEGER := 3;
BEGIN
 IF
  i > j THEN
   RAISE NOTICE'i 大于 j';
  ELSIF i < j THEN
   RAISE NOTICE'i 小于 j';
   ELSE RAISE NOTICE'i 等于 j';
   
  END IF;
  
 END $$;

CASE语句

类似Java中switch-case语句

简单Case语句示例:

DO $$ DECLARE
i INTEGER := 3;
BEGIN
 CASE
   i
   WHEN 1,
   2 THEN
    RAISE NOTICE'one or two';
   
   WHEN 3,
   4 THEN
    RAISE NOTICE'three or four';
    ELSE RAISE NOTICE'other value';
    
   END CASE;
   
  END $$;

搜索CASE语句示例:

DO $$ DECLARE
i INTEGER := 3;
BEGIN
 CASE
   
   WHEN i BETWEEN 0
   AND 10 THEN
    RAISE NOTICE'value is between zero and ten';
   
   WHEN i BETWEEN 11
   AND 20 THEN
    RAISE NOTICE'value is between eleven and twenty';
    ELSE RAISE NOTICE'other value';
    
   END CASE;
  
END $$;

循环语句

PostgreSQL 提供 4 种循环执行命令的语句:

LOOP、WHILE、FOR 和 FOREACH 循环,以及循环控制的 EXIT 和 CONTINUE 语句。

LOOP 用于定义一个无限循环语句,一般需要使用 EXIT 或者 RETURN 语句退出循环,

label 可以用于 EXIT 或者 CONTINUE 语句退出或者跳到执行的嵌套循环中。

LOOP循环示例:

DO $$ DECLARE
i INTEGER := 0;
BEGIN
  LOOP
  EXIT
  WHEN i = 5;
 i := i + 1;
 RAISE NOTICE'Loop: %',
 i;
 
END LOOP;

END $$;

CONTINUE 表示忽略后面的语句,直接进入下一次循环。

示例:

DO $$ DECLARE
i INTEGER := 0;
BEGIN
  LOOP
  EXIT
  WHEN i = 10;
 i := i + 1;
 CONTINUE
  WHEN MOD ( i, 2 ) = 1;
 RAISE NOTICE'Loop: %',
 i;
 
END LOOP;

END $$;

WHILE循环表示当表达式 boolean-expression 的值为真时,循环执行其中的语句;

然后重新计算表达式的值,当表达式的值假时退出循环。

WHILE循环示例:

DO $$ DECLARE
i INTEGER := 0;
BEGIN
  WHILE
  i < 5
  LOOP
  i := i + 1;
 RAISE NOTICE'Loop: %',
 i;
 
END LOOP;

END $$;

FOR 循环可以用于遍历一个整数范围或者查询结果集。

FOR 循环默认从小到大进行遍历,REVERSE 表示从大到小遍历;BY 用于指定每次的增量,默认为 1。

FOR循环示例:

DO $$ BEGIN
 FOR i IN 1..5 BY 2
 LOOP
 RAISE NOTICE'Loop: %',
 i;
 
END LOOP;

END $$;

FOREACH 循环与 FOR 循环类似,只不过变量的是一个数组

FOREACH 循环示例:

DO $$ DECLARE x INT; BEGIN FOREACH x IN ARRAY ( ARRAY [[ 1, 2, 3 ],[ 4, 5, 6 ]]
  )
 LOOP
 RAISE NOTICE'x = %',
 x;
 
END LOOP;

END $$; 

 

标签:语句,CASE,NOTICE,Postgresql,RAISE,BEGIN,END,name
From: https://www.cnblogs.com/badaoliumangqizhi/p/17914325.html

相关文章

  • Postgresql中自增主键序列的使用以及数据传输时提示:错误:关系"xxx_xx_xx_seq"不存在
    场景Postgresql在Windows中使用pg_dump实现数据库(指定表)的导出与导入:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135011801上面讲使用pg_dump进行postgresql的导出与导入。如果使用Navicat可以直接连接两个库,则可直接使用数据传输功能。但是在传输某个表......
  • ElasticSearch中查询语句用法(match、match_phrase、multi_match、query_string)
    1、match略1.1不同字段权重如果需要为不同字段设置不同权重,可以考虑使用bool查询的should子句来组合多个match查询,并为每个match查询设置不同的权重。{"query":{"bool":{"should":[{"match":{"product_name":......
  • 记一次postgresql数据库插入记录失败的问题。。。
    代码在测试环境中运行了一段时间,之前都没有问题,突然pg数据库中的某个表不能插入记录了,具体来说是新插入的主键与表中已有记录的主键重复导致入库失败,但是主键设置的是自增策略,理论上说,不会重复。网上看到有人说需要设置下该表主键对应序列的下一个值。查看表的数据定义语句如下......
  • ***Python语句操作
    一、条件控制Python中有哪些值代表FalseNoneFlase0"":空字符串[]:空列表{}:空字典():空元组1、if语句ifcondition_1:statement_block_1elifcondition_2:statement_block_2else:statement_block_3注意:1、每个条件后面要使用冒号**:**,表示接下来......
  • A Guide to Image and Video based Small Object Detection using Deep Learning : Ca
    AGuidetoImageandVideobasedSmallObjectDetectionusingDeepLearning:CaseStudyofMaritimeSurveillance基于图像和视频的小对象指南使用深度学习进行检测:的案例研究海上监视1介绍在本文中我们对2017年至2022年间发表的160多篇研究论文进行了全面回顾,以......
  • PostgreSQL PG_DUMP 工作失败了怎么回事及如何处理
    最近群里有同学问关于pg_dump失败的问题,但是最近老眼昏花脑子搭错线,看成mysqldump还傻傻的问人家mysql那个版本。所以基于这个pg_dump的问题的写一篇,pgdump对比mysqldump来说,的确从功能性和性能方面要比mysql给的逻辑备份的方式要好的多,这里我们可以稍微浅浅的比较一下1 pg_dum......
  • ROW_NUMBER 开窗函数优化方案(Oracle && PostgreSQL 性能比对)
    帮朋友优化一条很简单的窗口函数ROW_NUMBER()OVER(),Oracle迁移PostgreSQL项目。原始SQL和执行计划STUDENT_BAK表我模拟的数据,3千万行数据。SELECTSTU_ID,STU_NAME,STU_SEX,STU_AGE,STU_DATE,STU_CLASSID,STU_SALFROM(SELECTSB.*, ROW_NUMBER()OVER(P......
  • 无涯教程-Java - String toUpperCase()函数
    将字符串转成大写字母,这等效于调用toUpperCase(Locale.getDefault())。StringtoUpperCase()-语法publicStringtoUpperCase()StringtoUpperCase()-返回值它返回字符串,并转换为大写。StringtoUpperCase()-示例importjava.io.*;publicclassTest{publics......
  • 无涯教程-Java - String toLowerCase(Locale locale)函数
    如果指定Locale则根据Locale将此String中的所有字符转换为小写,否则调用toLowerCase(Locale.getDefault())默认方法。StringtoLowerCase-语法publicStringtoLowerCase(Localelocale)StringtoLowerCase-返回值它返回转换为小写字母的字符串。StringtoLowerCase-示......
  • 无涯教程-Java - String toLowerCase()函数
    将此String中的所有字符转换为小写,这等同于调用toLowerCase(Locale.getDefault())。StringtoLowerCase()-语法publicStringtoLowerCase()StringtoLowerCase()-返回值它返回转换为小写字母的字符串。StringtoLowerCase()-示例importjava.io.*;publicclassTest......