OushuDB-PL 过程语言-控制结构

简介: OushuDB-PL 过程语言-控制结构

\1. 函数返回:

1). RETURN expression 该表达式用于终止当前的函数,然后再将expression的值返回给调用者。如果返回简单类型,那么可以 使用任何表达式,同时表达式的类型也将被自动转换成函数的返回类型,就像我们在赋值中描述的那 样。如果要返回一个复合类型的数值,则必须让表达式返回记录或者匹配的行变量。

2). RETURN NEXT expression

如果PL/pgSQL函数声明为返回SETOF sometype,其行记录是通过RETURN NEXT命令进行填充的,直 到执行到不带参数的RETURN时才表示该函数结束。因此对于RETURN NEXT而言,它实际上并不从函数 中返回,只是简单地把表达式的值保存起来,然后继续执行PL/pgSQL函数里的下一条语句。随着 RETURN NEXT命令的迭代执行,结果集最终被建立起来。该类函数的调用方式如下:

SELECT * FROM some_func(); 它被放在FROM子句中作为数据源使用。最后需要指出的是,如果结果集数量很大,那么通过该种方式 来构建结果集将会导致极大的性能损失。

\2. 条件: 在PL/pgSQL中有以下三种形式的条件语句。

1). IF-THEN

2). IF-THEN-ELSE

IF boolean-expression THEN

    statements


END IF;
IF boolean-expression THEN
    statements
ELSE
    statements
END IF;
3). IF-THEN-ELSIF-ELSE
IF boolean-expression THEN
    statements
ELSIF boolean-expression THEN
    statements
ELSIF boolean-expression THEN
    statements


关于条件语句,这里就不在做过多的赘述了。

\3. 循环: 1). LOOP

LOOP定义一个无条件的循环,直到由EXIT或者RETURN语句终止。可选的label可以由EXIT和 CONTINUE语句使用,用于在嵌套循环中声明应该应用于哪一层循环。

2). EXIT

如果没有给出label,就退出最内层的循环,然后执行跟在END LOOP后面的语句。如果给出label,它必 须是当前或更高层的嵌套循环块或语句块的标签。之后该命名块或循环就会终止,而控制则直接转到对 应循环/块的END语句后面的语句上。 如果声明了WHEN,EXIT命令只有在expression为真时才被执行,否则将直接执行EXIT后面的语句。见 如下示例:

LOOP

    statements
END LOOP [ label ];
EXIT [ label ] [ WHEN expression ];
LOOP
-- do something
EXIT WHEN count > 0;


END LOOP;

3). CONTINUE

如果没有给出label,CONTINUE就会跳到最内层循环的开始处,重新进行判断,以决定是否继续执行循 环内的语句。如果指定label,则跳到该label所在的循环开始处。如果声明了WHEN,CONTINUE命令只 有在expression为真时才被执行,否则将直接执行CONTINUE后面的语句。见如下示例:

CONTINUE [ label ] [ WHEN expression ];

ELSE

statements
END IF;
4). WHILE
[ <<label>> ]
WHILE expression LOOP
    statements
END LOOP [ label ];

只要条件表达式为真,其块内的语句就会被循环执行。条件是在每次进入循环体时进行判断的。见如下

示例:


5). FOR


WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP
    --do something
END LOOP;
[ <<label>> ]
FOR name IN [ REVERSE ] expression .. expression LOOP
    statements
END LOOP [ label ];

变量name自动被定义为integer类型,其作用域仅为FOR循环的块内。表示范围上下界的两个表达式只 在进入循环时计算一次。每次迭代name值自增1,但如果声明了REVERSE,name变量在每次迭代中将 自减1,见如下示例:

LOOP

-- do something
EXIT WHEN count > 100;
CONTINUE WHEN count < 50;
END LOOP;
FOR i IN 1..10 LOOP
    --do something
    RAISE NOTICE 'i IS %', i;
END LOOP;
FOR i IN REVERSE 10..1 LOOP


\4. 遍历命令结果:

[ <<label>> ]

FOR record_or_row IN query LOOP
    statements
END LOOP [ label ];

这是另外一种形式的FOR循环,在该循环中可以遍历命令的结果并操作相应的数据,见如下示例:

PL/pgSQL还提供了另外一种遍历命令结果的方式,和上面的方式相比,唯一的差别是该方式将SELECT 语句存于字符串文本中,然后再交由EXECUTE命令动态的执行。和前一种方式相比,该方式的灵活性更 高,但是效率较低。

FOR rec IN SELECT * FROM some_table LOOP

  PERFORM some_func(rec.one_col);
END LOOP;
[ <<label>> ]
FOR record_or_row IN EXECUTE text_expression LOOP
    statements
END LOOP [ label ];

\5. 异常捕获:

在PL/pgSQL函数中,如果没有异常捕获,函数会在发生错误时直接退出,与其相关的事物也会随之回 滚。我们可以通过使用带有EXCEPTION子句的BEGIN块来捕获异常并使其从中恢复。见如下声明形式:

 --do something
 END LOOP;
[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
EXCEPTION
    WHEN condition [ OR condition ... ] THEN
        handler_statements

如果没有错误发生,只有BEGIN块中的statements会被正常执行,然而一旦这些语句中有任意一条发生 错误,其后的语句都将被跳过,直接跳转到EXCEPTION块的开始处。此时系统将搜索异常条件列表,寻 找匹配该异常的第一个条件,如果找到匹配,则执行相应的handler_statements,之后再执行END的下 一条语句。如果没有找到匹配,该错误就会被继续向外抛出,其结果与没有EXCEPTION子句完全等同。 如果此时handler_statements中的语句发生新错误,它将不能被该EXCEPTION子句捕获,而是继续向外 传播,交由其外层的EXCEPTION子句捕获并处理。见如下示例:

INSERT INTO mytab(firstname, lastname) VALUES('Tom', 'Jones');

BEGIN
    UPDATE mytab SET firstname = 'Joe' WHERE lastname = 'Jones';
    x := x + 1;
    y := x / 0;
EXCEPTION
    WHEN division_by_zero THEN


END;

RAISE NOTICE 'caught division_by_zero';

RETURN x;

当以上函数执行到y := x / 0语句时,将会引发一个异常错误,代码将跳转到EXCEPTION块的开始处,之 后系统会寻找匹配的异常捕捉条件,此时division_by_zero完全匹配,这样该条件内的代码将会被继续 执行。需要说明的是,RETURN语句中返回的x值为x := x + 1执行后的新值,但是在除零之前的update 语句将会被回滚,BEGIN之前的insert语句将仍然生效。

目录
相关文章
|
存储 关系型数据库 MySQL
DataX: 阿里开源的又一款高效数据同步工具
DataX 是由阿里巴巴集团开源的一款大数据同步工具,旨在解决不同数据存储之间的数据迁移、同步和实时交换的问题。它支持多种数据源和数据存储系统,包括关系型数据库、NoSQL 数据库、Hadoop 等。 DataX 提供了丰富的数据读写插件,可以轻松地将数据从一个数据源抽取出来,并将其加载到另一个数据存储中。它还提供了灵活的配置选项和高度可扩展的架构,以适应各种复杂的数据同步需求。
|
7月前
|
传感器 数据采集 物联网
智能互联,未来在手:解读可穿戴设备与物联网的深度融合
智能互联,未来在手:解读可穿戴设备与物联网的深度融合
611 85
|
10月前
|
存储 人工智能 缓存
【AI系统】Ascend C 语法扩展
Ascend C 是基于标准 C++ 扩展的编程语言,专为华为昇腾处理器设计。本文介绍了 Ascend C 的基础语法扩展、API(基础与高阶)、关键编程对象(数据存储、任务间通信与同步、资源管理及临时变量),以及如何利用这些特性高效开发。通过华为自研的毕昇编译器,Ascend C 实现了主机与设备侧的独立执行能力,支持不同地址空间的访问。API 包括计算、数据搬运、内存管理和任务同步等功能,旨在帮助开发者构建高性能的 AI 应用。
293 2
【AI系统】Ascend C 语法扩展
|
JavaScript 前端开发 安全
vue2.0+vue3.0资料(尚硅谷)(二)
vue2.0+vue3.0资料(尚硅谷)
165 0
|
资源调度 前端开发 JavaScript
Vue3中如何使用axios进行Ajax请求?
Vue3中如何使用axios进行Ajax请求?
359 1
|
API
FFmpeg中AVPacket、AVFrame结构的基本使用
FFmpeg中AVPacket和AVFrame结构的内存分配、释放和引用计数处理,以及如何避免内存泄漏。
320 3
|
存储 安全 JavaScript
XSS攻击(Cross-Site Scripting)
【8月更文挑战第11天】
353 2
|
安全 Shell
关于双击桌面上的IE图标却显示“打开方式”对话框的解决办法
关于双击桌面上的IE图标却显示“打开方式”对话框的解决办法
|
资源调度 监控 前端开发
手把手教你写一个脚手架(下)
手把手教你写一个脚手架(下)
141 0