PL/pgSQL学习笔记之四

摘要:
一个块出现在另外一个块中的时候,必须接END;形式,如上图所示。但是包含函数体的最后一个END后,可以不接分号。如果在END后使用了label,它必须和该块开始时的label相一致。注释在PL/pgSQL中的作用方式和在普通SQL中的相同。例如:CREATEFUNCTIONsomefunc()RETURNSintegerAS$$˂˃DECLAREquantityinteger:=30;BEGINRAISENOTICE'Quantityhereis%',quantity;--Prints30quantity:=50;----Createasubblock--DECLAREquantityinteger:=80;BEGINRAISENOTICE'Quantityhereis%',quantity;--Prints80RAISENOTICE'Outerquantityhereis%',outerblock.quantity;--Prints50END;RAISENOTICE'Quantityhereis%',quantity;--Prints50RETURNquantity;END;$$LANGUAGEplpgsql;注意:在PL/pgSQL函数体外围,有一个隐藏的”outerblock”。有一点很重要,请不要把PL/pgSQL中的未来分割语句而使用的BEGIN/END和SQL命令中用于事务控制的同名指令搞混了。PL/pgSQL的BEGIN/END仅仅是用于分割;它们并不能开始或停止一个事务。

http://www.postgresql.org/docs/9.1/static/plpgsql-structure.html

39.2. PL/pgSQL 的结构

PL/pgSQL是一种块式结构的语言。完整的函数定义必须是一个块。一个块的定义形式如下:

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

在块中,每一个声明或语句都以分号结束。一个块出现在另外一个块中的时候,必须接 END;形式,如上图所示。但是包含函数体的最后一个END后,可以不接分号。

注意:在BEGIN后不要接分号。

当你需要在EXIT语句中使用一个块时,你才需要使用 label,或者当你需要通过块名称来把此块内的变量和其他同名变量进行区分时,你需要使用label。如果在 END 后使用了 label,它必须和该块开始时的label相一致。

所有的关键字都是大小写不敏感的。变量定义会被转换为小写字母,除非使用了双引号,这和普通SQL命令中的作法一样。

注释在PL/pgSQL中的作用方式和在普通SQL中的相同。双线开始一个注释知道此行末尾。一个以/*开始的标志表示一段注释,直到遇到 */。块注释是可嵌套的。

在块中的语句章节部分,任何语句都可以是一个子块。子块可以用于逻辑分组或者在小的语句组中使用本地变量定义。在子块中声明的变量,覆盖任何外部块中的同名变量;但是你可以通过给出块名的方式来访问子块外部变量。例如:

CREATE FUNCTION somefunc() RETURNS integer AS$$
<< outerblock >>
DECLARE
    quantity integer := 30;
BEGIN
    RAISE NOTICE 'Quantity here is %', quantity;  --Prints 30
    quantity := 50;
    --
    --Create a subblock
    --
    DECLARE
        quantity integer := 80;
    BEGIN
        RAISE NOTICE 'Quantity here is %', quantity;  --Prints 80
        RAISE NOTICE 'Outer quantity here is %', outerblock.quantity;  --Prints 50
    END;
    RAISE NOTICE 'Quantity here is %', quantity;  --Prints 50
    RETURNquantity;
END;
$$ LANGUAGE plpgsql;

注意:在PL/pgSQL函数体外围,有一个隐藏的”outer block”。此处可提供对函数参数的声明,也包括一些特殊的变量如FOUND。此外围块用函数名来标识,意味着这些个参数和特殊变量可以通过函数名来制定访问路径。

有一点很重要,请不要把PL/pgSQL中的未来分割语句而使用的BEGIN/END和 SQL命令中用于事务控制的 同名指令搞混了。PL/pgSQL的BEGIN/END仅仅是用于分割;它们并不能开始或停止一个事务。 函数或者触发器过程总是在一个事务的内部得到执行,这个事务由外部查询发起— 函数或触发器过程不能启动或者提交一个事务,因为没有供它们执行的上下文。但是,一个包含EXCEPTION 的块可以形成一个子事务,此子事务能够回滚而不影响外部事务。

免责声明:文章转载自《PL/pgSQL学习笔记之四》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇bower简明入门教程ros自定义消息的时候报错ImportError: No module named em下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring事务管理接口:PlatformTransactionManager、TransactionDefinition和TransactionStatus

Spring 的事务管理是基于 AOP 实现的,而 AOP 是以方法为单位的。Spring 的事务属性分别为传播行为、隔离级别、只读和超时属性,这些属性提供了事务应用的方法和描述策略。 在 Java EE 开发经常采用的分层模式中,Spring 的事务处理位于业务逻辑层,它提供了针对事务的解决方案。 在 Spring 解压包的 libs 目录中,包含...

C/C++获取系统当前时间

C/C++获取系统当前时间   C库中与系统时间相关的函数定义在<time.h>头文件中, C++定义在<ctime>头文件中。 一、time(time_t*)函数 函数定义如下: time_t time (time_t* timer); 获取系统当前日历时间 UTC 1970-01-01 00:00:00开始的unix时间戳参数:...

Java枚举类型的理解及在后台响应中的使用

在前后台分离开发过程中,统一响应的格式可以使用枚举类型进行规范开发,对于不同的错误/异常类型可以响应不同的状态码和响应信息。 1,枚举类型的简单理解:枚举类型就是包含了已经创建好对象的final类,这个final类的开始是一些枚举变量,枚举变量可以有多个值,这些参数被赋给了枚举对象, 枚举对象可以通过枚举类调用枚举变量获取。 总结以下几点: 1)枚举类型不...

Java内存优化和性能优化的几点建议

1.没有必要时请不用使用静态变量     使用Java的开发者都知道,当某个对象被定义为stataic变量所引用,这个对象所占有的内存将不会被回收。有时,开发者会将经常调用的对象或者变量定义为static,以便提高程序的运行性能。因此,不是常用到的对象或者变量,不要定义为static类型的变量,尤其是静态类对象的定义,一定要仔细考虑是否有必要。例如  ...

Java之JDK的安装与环境配置

官网下载合适的安装包。进入官网的下载地址https://www.oracle.com/java/technologies/downloads/#jdk17-windows这里安装的是最近的JDK17。选择合适的版本(这里选择的是window ),并下载。   注:后文安装的是jdk-8u91-windows-x64.exe。与下载的不一致,当安装步骤时一致...

java栈、堆

一。栈、堆几个小概念 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。) 3. 堆:存放所有new出来的对象。 4. 静态域 :存放静态成员(static定义的) 5. 常量池 :...