第一,声明
所有在块里面的变量都必须在块的声明段里面首先进行声明,唯一例外的就是for循环里面的循环计数变量,它会自动被声明为整型。
变量的声明语法如下:
变量名 [CONSTANT] 变量类型 [NOT NULL] [{ DEFAULT | := } 表达式];
对于声明语法,需要说明的几点是:
①sql中的数据类型均可以作为plpgsql变量的数据类型,比如integer、varchara和char等等。
②如果给出了DEFAULT语句,则该变量在进入BEGIN块时将会被初始化为该缺省值,如果被初始化为sql空值,则缺省值则是每次进入该块的时候进行计算的。很经典的一个例子就是如果我们把now()赋值给一个类型为timestamp类型的变量,那么该变量的值将会被赋值为该函数实际调用的时候的时间,而不是函数预编译的时候的时间。
③其中CONSTANT是为了避免该变量在进入BEGIN后被重新赋值,它就是保证该变量始终作为一个常量。
④如果我们声明了NOT NULL,那么给该变量赋予NULL值将会给该变量导致一个运行时错误,因此所有被声明为NOT NULL的变量必须在声明时定义一个非空的缺省值。
对于函数的参数我们有如下介绍:
①传递给函数的参数我们都是使用$1以及$2这样的标识符来表示的,但是为了增强可读性,我们可以为其声明一个别名,之后我们可以使用别名和数字标识符都可以引用到该变量。
②其中我们还可以在声明段中为参数变量定义别名,它的格式是: 变量名 ALIAS FOR $1 ,当然这里的$1可以替换为其他的变量。
③对于输出参数而言,我们遵循上面两个规则,而且输出参数需要在变量名前面添加一个OUT标识符。
④如果plpgsql函数的返回类型为多态类型,那么函数就会创建一个特殊的参数:$0,我们依然可以为该变量设置别名。
对于拷贝类型,它不是一个数据类型,它是使用某个变量名的数据类型作为它的数据类型,我们可以使用格式为: 变量名%TYPE,其中%TYPE表示一个变量或者字段的数据类型,而plpgsql允许通过该方式声明一个变量,它的类型等同于该变量名的数据类型。
对于行类型,我们可以使用如下的声明方式: 变量名 表名%ROWTYPE,它表示指定表的行类型,当我们在创建一个表的时候,pgsql也会随之创建出一个与之相应的复合类型,该类型名等同于表名。当然如果我们要访问变量中的某个域的字段,我们也可以使用点表示法,也就是"表名.字段名"的方式。
其实还有一种记录类型,它的使用格式为: 变量名 RECORD ,对于记录类型,它有点类似于行类型变量,但是它没有预定义的结构,我们只能通过select或者for命令来获取实际的行结构,因此记录变量在被初始化之前是无法被访问的,否则将会引起运行时错误。
另外,需要说明的是,RECORD并不是一个真正的数据类型,它只是一个占位符。
第二,基本语句
对于赋值语句,在pgsql中的基本形式为: 变量名 := 表达式,等号两边的变量和表达式的数据类型要么一直,要么可以通过类型转换得到,否则会在运行时出错。
我们还可以使用select into来给记录变量或者行类型的变量进行赋值,它的一般使用形式是:select into 目标值 字段 from ..... ,注意这种赋值方式依次只能赋值给一个变量,如果我们将一行或者一个变量列表用作目标,那么选出的数值必须精确匹配目标的结构,否则就会产生运行时错误。
通常我们要测试一条记录或者一行结果是否为空,我们可以使用is null为条件进行判断,但是对于返回多条记录的情况则无法判断。
原文链接:https://www.f2er.com/postgresql/195037.html