• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >PostgreSQL > PostgreSQL教程(二十):PL/pgSQL过程语言

PostgreSQL教程(二十):PL/pgSQL过程语言

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了postgresql教程,postgresql安装教程,postgresql使用教程,postgresql视频教程,postgresql数据库教程等相关知识,希望本文的分享对您有所帮助

一、概述:

    PL/pgSQL函数在第一次被调用时,其函数内的源代码(文本)将被解析为二进制指令树,但是函数内的表达式和SQL命令只有在首次用到它们的时候,PL/pgSQL解释器才会为其创建一个准备好的执行规划,随后对该表达式或SQL命令的访问都将使用该规划。如果在一个条件语句中,有部分SQL命令或表达式没有被用到,那么PL/pgSQL解释器在本次调用中将不会为其准备执行规划,这样的好处是可以有效地减少为PL/pgSQL函数里的语句生成分析和执行规划的总时间,然而缺点是某些表达式或SQL命令中的错误只有在其被执行到的时候才能发现。
    由于PL/pgSQL在函数里为一个命令制定了执行计划,那么在本次会话中该计划将会被反复使用,这样做往往可以得到更好的性能,但是如果你动态修改了相关的数据库对象,那么就有可能产生问题,如:
      CREATE FUNCTION populate() RETURNS integer AS $$
    DECLARE
        -- 声明段
    BEGIN
        PERFORM my_function();
    END;
    $$ LANGUAGE plpgsql;
 </div>
    在调用以上函数时,PERFORM语句的执行计划将引用my_function对象的OID。在此之后,如果你重建了my_function函数,那么populate函数将无法再找到原有my_function函数的OID。要解决该问题,可以选择重建populate函数,或者重新登录建立新的会话,以使PostgreSQL重新编译该函数。要想规避此类问题的发生,在重建my_function时可以使用CREATE OR REPLACE FUNCTION命令。

    鉴于以上规则,在PL/pgSQL里直接出现的SQL命令必须在每次执行时均引用相同的表和字段,换句话说,不能将函数的参数用作SQL命令的表名或字段名。如果想绕开该限制,可以考虑使用PL/pgSQL中的EXECUTE语句动态地构造命令,由此换来的代价是每次执行时都要构造一个新的命令计划。

    使用PL/pgSQL函数的一个非常重要的优势是可以提高程序的执行效率,由于原有的SQL调用不得不在客户端与服务器之间反复传递数据,这样不仅增加了进程间通讯所产生的开销,而且也会大大增加网络IO的开销。

二、PL/pgSQL的结构:

    PL/pgSQL是一种块结构语言,函数定义的所有文本都必须在一个块内,其中块中的每个声明和每条语句都是以分号结束,如果某一子块在另外一个块内,那么该子块的END关键字后面必须以分号结束,不过对于函数体的最后一个END关键字,分号可以省略,如:
      [ <<label>> ]
    [ DECLARE declarations ]
    BEGIN
        statements
    END [ label ];
 </div>
    在PL/pgSQL中有两种注释类型,双破折号(--)表示单行注释。/* */表示多行注释,该注释类型的规则等同于C语言中的多行注释。
    在语句块前面的声明段中定义的变量在每次进入语句块(BEGIN)时都会将声明的变量初始化为它们的缺省值,而不是每次函数调用时初始化一次。如:
      CREATE FUNCTION somefunc() RETURNS integer AS $$
    DECLARE
       quantity integer := 30;
    BEGIN
       RAISE NOTICE 'Quantity here is %', quantity;      --在这里的数量是30
       quantity := 50;
       --
       -- 创建一个子块
       --
       DECLARE
          quantity integer := 80;
       BEGIN
          RAISE NOTICE 'Quantity here is %', quantity;   --在这里的数量是80
       END;
       RAISE NOTICE 'Quantity here is %', quantity;      --在这里的数量是50   
       RETURN quantity;
    END;
    $$ LANGUAGE plpgsql;
    #执行该函数以进一步观察其执行的结果。
    postgres=# select somefunc();
    NOTICE:  Quantity here is 30
    NOTICE:  Quantity here is 80
    NOTICE:  Quantity here is 50
     somefunc
    ----------
           50
    (1 row)
</div>
    最后需要说明的是,目前版本的PostgreSQL并不支持嵌套事务,函数中的事物总是由外层命令(函数的调用者)来控制的,它们本身无法开始或提交事务。

三、声明:

    所有在块里使用的变量都必须在块的声明段里先进行声明,唯一的例外是FOR循环里的循环计数变量,该变量被自动声明为整型。变量声明的语法如下:
      variable_name [ CONSTANT ] variable_type [ NOT NULL ] [ { DEFAULT | := } expression ];
 </div>
    1). SQL中的数据类型均可作为PL/pgSQL变量的数据类型,如integer、varchar和char等。
    2). 如果给出了DEFAULT子句,该变量在进入BEGIN块时将被初始化为该缺省值,否则被初始化为SQL空值。缺省值是在每次进入该块时进行计算的。因此,如果把now()赋予一个类型为timestamp的变量,那么该变量的缺省值将为函数实际调用时的时间,而不是函数预编译时的时间。
    3). CONSTANT选项是为了避免该变量在进入BEGIN块后被重新赋值,以保证该变量为常量。
    4). 如果声明了NOT NULL,那么赋予NULL数值给该变量将导致一个运行时错误。因此所有声明为NOT NULL的变量也必须在声明时定义一个非空的缺省值。

    1. 函数参数的别名:
    传递给函数的参数都是用$1、$2这样的标识符来表示的。为了增加可读性,我们可以为其声明别名。之后别名和数字标识符均可指向该参数值,见如下示例:
    1). 在函数声明的同时给出参数变量名。
      CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $$
    BEGIN
        RETURN subtotal * 0.06;
    END;
    $$ LANGUAGE plpgsql;
 </div>
    2). 在声明段中为参数变量定义别名。
      CREATE FUNCTION sales_tax(REAL) RETURNS real AS $$
    DECLARE
        subtotal ALIAS FOR $1;
    BEGIN
    &

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • CentOS 7下安装PostgreSQL 9.6的教程分享
  • windows PostgreSQL 9.1 安装详细步骤
  • 深入解读PostgreSQL中的序列及其相关函数的用法
  • PostgreSQL教程(二十):PL/pgSQL过程语言
  • PostgreSQL教程(十九):SQL语言函数
  • PostgreSQL教程(十六):系统视图详解
  • PostgreSQL教程(十五):系统表详解
  • PostgreSQL教程(十四):数据库维护
  • PostgreSQL教程(十二):角色和权限管理介绍
  • PostgreSQL教程(十一):服务器配置

相关文章

  • 2017-05-11PostgreSQL教程(十九):SQL语言函数
  • 2017-05-11SQL Server数据迁移至PostgreSQL出错的解释以及解决方案
  • 2017-05-11PostgreSQL中关闭死锁进程的方法
  • 2017-05-11CentOS中运行PostgreSQL需要修改的内核参数及配置脚本分享
  • 2017-05-11FREEBSD安装POSTGRESQL笔记
  • 2017-05-11Mac OS上安装PostgreSQL的教程
  • 2017-05-11PostgreSQL教程(十六):系统视图详解
  • 2017-05-11用PostgreSQL数据库做地理位置app应用
  • 2017-05-11Linux CentOS 7源码编译安装PostgreSQL9.5
  • 2017-05-11PostgreSQL 角色与用户管理介绍

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • PostgreSQL中的XML操作函数代码
    • PostgreSQL的存储过程简单入门
    • PostgreSQL 查看数据库,索引,表,表空间大小的示例代码
    • 用PostgreSQL数据库做地理位置app应用
    • SQL Server数据迁移至PostgreSQL出错的解释以及解决方案
    • PostgreSQL教程(一):数据表详解
    • CentOS中运行PostgreSQL需要修改的内核参数及配置脚本分享
    • 修改一行代码提升 Postgres 性能 100 倍
    • PostgreSQL之分区表(partitioning)
    • 深入解读PostgreSQL中的序列及其相关函数的用法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有