当前位置:   article > 正文

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

pgsql功能和语法

场景

PostGresSQL简介与Windows上的安装教程

PostGresSQL简介与Windows上的安装教程_postgressql windows安装免费吗?-CSDN博客

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

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

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

注:

博客:
霸道流氓气质_C#,架构之路,SpringBoot-CSDN博客

实现

1、PL/pgSQL 代码块结构

  1. [ <<label>> ]
  2. [ DECLARE
  3.  declarations ]
  4. BEGIN
  5.  statements;
  6.  ...
  7. END [ label ];

结构说明:

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

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

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

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

代码块示例:

  1. DO $$
  2. DECLARE
  3.  name text;
  4. BEGIN
  5.  name := '霸道';
  6.  RAISE NOTICE 'Hello % !', name;
  7. END $$;

运行结果:

示例说明:

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

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

RAISE NOTICE用于输出通知消息。

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

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

2、嵌套子块

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

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

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

示例代码:

  1. DO $$
  2. <<outer_block>>
  3. DECLARE
  4.  name text;
  5. BEGIN
  6.  name := 'outer_block';
  7.  RAISE NOTICE 'This is %', name;
  8.  DECLARE
  9.  name text := 'sub_block';
  10.  BEGIN
  11.  RAISE NOTICE 'This is %', name;
  12.  RAISE NOTICE 'The name FROM the outer block is %', outer_block.name;
  13.  END;
  14.  RAISE NOTICE 'This is %', name;
  15.  
  16. END outer_block $$;

执行结果:

3、声明与赋值

声明变量

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

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

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

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

变量声明示例:

  1. DO $$
  2. DECLARE
  3.  name text;
  4.  age numeric(5) DEFAULT 20;
  5.  url varchar := 'www.123.com';
  6. BEGIN
  7.  name := '霸道';
  8.  RAISE NOTICE 'age= %', age;
  9.  RAISE NOTICE 'url= %', url;
  10. END $$;

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

声明常量

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

示例代码:

通过定义PI计算圆的面积

  1. DO $$
  2. DECLARE
  3.  PI CONSTANT NUMERIC := 3.14159265;
  4.  radius NUMERIC;
  5. BEGIN
  6.  radius := 5.0;
  7.  RAISE NOTICE 'The area is %', PI * radius * radius;
  8. END $$;

示例运行结果:

4、控制结构

IF语句

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

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

示例代码:

  1. DO $$ DECLARE
  2. i INTEGER := 3;
  3. j INTEGER := 3;
  4. BEGIN
  5.  IF
  6.   i > j THEN
  7.    RAISE NOTICE'i 大于 j';
  8.   ELSIF i < j THEN
  9.    RAISE NOTICE'i 小于 j';
  10.    ELSE RAISE NOTICE'i 等于 j';
  11.    
  12.   END IF;
  13.   
  14.  END $$;

CASE语句

类似Java中switch-case语句

简单Case语句示例:

  1. DO $$ DECLARE
  2. i INTEGER := 3;
  3. BEGIN
  4.  CASE
  5.    i
  6.    WHEN 1,
  7.    2 THEN
  8.     RAISE NOTICE'one or two';
  9.    
  10.    WHEN 3,
  11.    4 THEN
  12.     RAISE NOTICE'three or four';
  13.     ELSE RAISE NOTICE'other value';
  14.     
  15.    END CASE;
  16.    
  17.   END $$;

搜索CASE语句示例:

  1. DO $$ DECLARE
  2. i INTEGER := 3;
  3. BEGIN
  4.  CASE
  5.    
  6.    WHEN i BETWEEN 0
  7.    AND 10 THEN
  8.     RAISE NOTICE'value is between zero and ten';
  9.    
  10.    WHEN i BETWEEN 11
  11.    AND 20 THEN
  12.     RAISE NOTICE'value is between eleven and twenty';
  13.     ELSE RAISE NOTICE'other value';
  14.     
  15.    END CASE;
  16.   
  17. END $$;

循环语句

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

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

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

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

LOOP循环示例:

  1. DO $$ DECLARE
  2. i INTEGER := 0;
  3. BEGIN
  4.   LOOP
  5.   EXIT
  6.   WHEN i = 5;
  7.  i := i + 1;
  8.  RAISE NOTICE'Loop: %',
  9.  i;
  10.  
  11. END LOOP;
  12. END $$;

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

示例:

  1. DO $$ DECLARE
  2. i INTEGER := 0;
  3. BEGIN
  4.   LOOP
  5.   EXIT
  6.   WHEN i = 10;
  7.  i := i + 1;
  8.  CONTINUE
  9.   WHEN MOD ( i, 2 ) = 1;
  10.  RAISE NOTICE'Loop: %',
  11.  i;
  12.  
  13. END LOOP;
  14. END $$;

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

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

WHILE循环示例:

  1. DO $$ DECLARE
  2. i INTEGER := 0;
  3. BEGIN
  4.   WHILE
  5.   i < 5
  6.   LOOP
  7.   i := i + 1;
  8.  RAISE NOTICE'Loop: %',
  9.  i;
  10.  
  11. END LOOP;
  12. END $$;

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

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

FOR循环示例:

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

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

FOREACH 循环示例:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/406042
推荐阅读
相关标签
  

闽ICP备14008679号