PostgreSQL存储过程(六):结构控制和循环

news/2024/7/9 21:32:08 标签: postgresql

结构控制和循环介绍:

 

        作为编程语言中极为重要的知识,控制和循环可以降低代码量和减少人的工作量。在PL/PGSQL中实现了常用的控制结构和循环方法,灵活使用确实可以用来提高数据库查询的效率。

结构控制:

1. 结构:IF ... THEN ... ELSIF ... THEN ... ELSE ... END IF

CREATE OR REPLACE FUNCTION mydb.mysc.learn_conditional01(IN num integer,OUT result_str varchar(20)) AS
$BODY$
BEGIN
   IF num <= 0 THEN
     result_str = '小于等于0';
   ELSIF num <= 100 THEN
     result_str = '(0-100]';
   ELSIF num <= 1000 THEN
     result_str = '(100-1000]';
   ELSE 
     result_str = '1000以上';
   END IF;
END;
$BODY$
LANGUAGE plpgsql;

输出示例:

2. 结构:CASE ... WHEN ... THEN ... ELSE ... END CASE

CREATE OR REPLACE FUNCTION mydb.mysc.learn_conditional02(IN num integer,OUT result_str varchar(20)) AS
$BODY$
BEGIN
CASE num
    WHEN 1,2,3,4,5 THEN
        result_str = '1-5之间';
	WHEN 7,8,9,10,11 THEN
     result_str = '7-11之间';
    WHEN 12,13,14,15,16 THEN
     result_str = '12-16之间';
    ELSE 
     result_str = '其他的';
END CASE;
END;
$BODY$
LANGUAGE plpgsql;

输出示例:

3. 结构:CASE WHEN ... THEN ... ELSE ... END CASE

CREATE OR REPLACE FUNCTION mydb.mysc.learn_conditional03(IN num integer,OUT result_str varchar(20)) AS
$BODY$
BEGIN
   CASE 
       WHEN num <= 0 THEN
           result_str = '小于等于0';
       WHEN num <= 100 THEN
           result_str = '(0-100]';
       WHEN num <= 1000 THEN
           result_str = '(100-1000]';
   	   ELSE 
           result_str = '1000以上';
   END CASE; 
END;
$BODY$
LANGUAGE plpgsql;

输出示例:

循环:

1. LOOP循环

CREATE OR REPLACE FUNCTION mydb.mysc.learn_conditional04(OUT loopcnt integer) AS
$BODY$
DECLARE counter integer = 1;
BEGIN
   LOOP
	  EXIT WHEN counter > 100; -- 条件满足时退出循环
	  counter := counter+1;
	  CONTINUE WHEN counter = 50; -- 条件满足时,跳过下边的代码进入下一次循环
	  RAISE notice '这是第%次循环',counter;
   END LOOP;
   loopcnt = counter;
END;
$BODY$
LANGUAGE plpgsql;

输出示例:

2. WHILE循环

CREATE OR REPLACE FUNCTION mydb.mysc.learn_conditional05(OUT loopcnt integer) AS
$BODY$
DECLARE counter integer = 1;
BEGIN
	WHILE counter<=100 LOOP
		RAISE notice '这是第%次循环',counter;
		counter:=counter+1;
	END LOOP;
    loopcnt = counter;
END;
$BODY$
LANGUAGE plpgsql;

输出示例:

3. FOR循环

-- IN可以跟子查询
CREATE OR REPLACE FUNCTION mydb.mysc.learn_conditional06()
RETURNS Void AS
$BODY$
DECLARE counter integer = 1;
BEGIN
    RAISE notice '--------------';
	FOR i IN 1..10 LOOP  
        RAISE notice '这是第%次循环',i;
	END LOOP;
	RAISE notice '--------------';
	FOR i IN REVERSE 10..1 LOOP
        RAISE notice '这是倒序的第%次循环',i;
	END LOOP;
	RAISE notice '--------------';
	FOR i IN 1..10 BY 3 LOOP  --间隔2个数字
        RAISE notice '这是间隔2个数的第%次循环',i;
	END LOOP;
END;
$BODY$
LANGUAGE plpgsql;

输出示例:

4. FOREACH循环

-- 实现传入数组的累加功能
CREATE OR REPLACE FUNCTION mydb.mysc.learn_conditional07(IN intarray int[],OUT resultnum integer)AS
$BODY$
DECLARE
  x int;
  tmp integer := 0;
BEGIN
	FOREACH x IN ARRAY intarray 
	LOOP
		RAISE notice '这是%',x;
		tmp := tmp + x;
	END LOOP;
	resultnum = tmp;
END;
$BODY$
LANGUAGE plpgsql;

输出示例:


http://www.niftyadmin.cn/n/896537.html

相关文章

Hive SQL进阶案例(一):使用LAG函数判断日期连续性

一、LAG函数介绍 LAG函数是一个常用的窗口函数&#xff0c;作用是取当前行之后的数据&#xff0c;即把该列数据向上错位。使用方法如下&#xff1a; LAG(col ,n ,Default) col是字段名称&#xff0c;指明要操作的列&#xff0c;必须指定该参数&#xff1b; n表示取当前行的后…

Android Spinner下拉框使用

Spinner下拉框效果如下&#xff1a; 1.activity_main.xml&#xff0c;Spinner下拉框 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"…

python oserror errorno 39_python的bug? OSError: [Errno 9] Bad file number

前面发贴问了怎么定义一个全局变量&#xff0c;后来发现不是变量作用范围的问题。运行log:rootPandora # ./TestCase.pyTraceback (most recent call last):File "./TestCase.py", line 44, in TC.setup()File "./TestCase.py", line 31, in setupGWchild.…

python 增量聚类_使用Python的四种机器学习技术

机器学习回归在一些统计书籍中&#xff0c;我们经常会发现回归是衡量一个变量的均值与其他值的对应值之间相互关系的量度。那么让我们讨论一下该如何看待它。回归均值查尔斯达尔文的表兄弟弗朗西斯高尔顿(Francis Galton)观察了几代豌豆的大小。他得出的结论是&#xff0c;自然…

Android Studio 扫描识别二维码(包含闪光灯和本地二维码)、生成二维码、生成带logo的二维码

一、测试如下: 1.扫描识别二维码,扫描结果多少 2.生成二维码、生成带logo的二维码 二、添加依赖: 1.在Project的build.gradle中添加maven { url ‘https://jitpack.io’ } allprojects {repositories {google

hotmail域名_英国短信服务商以131万元收购域名it.co.uk

据namepros论坛消息&#xff0c;上个月域名IT.uk和IT.co.uk同时易主&#xff0c;今天IT.co.uk的交易价在sedo平台曝光&#xff0c;成交价为187,200英镑&#xff0c;约合人民币131万元。背后买家是英国短信服务提供商Intis Telecom。据悉&#xff0c;域名IT.uk和IT.co.uk的交易实…

Android项目中了解jcenter()、google()、maven{}、mavenCentral()

android项目project的build.gradle中代码如下&#xff1a; buildscript {repositories { // jcenter()google()mavenCentral()}dependencies {classpath com.android.tools.build:gradle:4.2.2} }allprojects {repositories { // jcenter()google()maven { url …

删除文件 fopen_rm删除文件空间就真的释放了吗?

删除一个文件在Linux&#xff0c;你是不是曾经天真的以为&#xff0c;使用rm删除一个文件&#xff0c;占用的空间就释放了&#xff1f;事情可能不是常常如人意。不信吗&#xff1f;来看下面的例子。产生一个指定大小的随机内容文件我们先看一下当前各个挂载目录的空间大小&…