辛星浅析plpgsql语法(中)

来源:互联网 发布:网络可爱美女图片 编辑:程序博客网 时间:2024/06/09 16:06

       第一,声明

       所有在块里面的变量都必须在块的声明段里面首先进行声明,唯一例外的就是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为条件进行判断,但是对于返回多条记录的情况则无法判断。





     

      

0 0
原创粉丝点击