postgresql学习手册(plpgsql过程语言)

postgresql学习手册(plpgsql过程语言)

ID:12183592

大小:44.00 KB

页数:10页

时间:2018-07-16

postgresql学习手册(plpgsql过程语言)_第1页
postgresql学习手册(plpgsql过程语言)_第2页
postgresql学习手册(plpgsql过程语言)_第3页
postgresql学习手册(plpgsql过程语言)_第4页
postgresql学习手册(plpgsql过程语言)_第5页
资源描述:

《postgresql学习手册(plpgsql过程语言)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、一、概述:   PL/pgSQL函数在第一次被调用时,其函数内的源代码(文本)将被解析为二进制指令树,但是函数内的表达式和SQL命令只有在首次用到它们的时候,PL/pgSQL解释器才会为其创建一个准备好的执行规划,随后对该表达式或SQL命令的访问都将使用该规划。如果在一个条件语句中,有部分SQL命令或表达式没有被用到,那么PL/pgSQL解释器在本次调用中将不会为其准备执行规划,这样的好处是可以有效地减少为PL/pgSQL函数里的语句生成分析和执行规划的总时间,然而缺点是某些表达式或SQL命令中的错误只有在其被执行到的时候才能发现。   由于PL/pgSQL在函数里

2、为一个命令制定了执行计划,那么在本次会话中该计划将会被反复使用,这样做往往可以得到更好的性能,但是如果你动态修改了相关的数据库对象,那么就有可能产生问题,如:   CREATEFUNCTIONpopulate()RETURNSintegerAS$$   DECLARE      --声明段   BEGIN      PERFORMmy_function();   END;   $$LANGUAGEplpgsql;   在调用以上函数时,PERFORM语句的执行计划将引用my_function对象的OID。在此之后,如果你重建了my_function函数,那么popu

3、late函数将无法再找到原有my_function函数的OID。要解决该问题,可以选择重建populate函数,http://qun.81nanchang.cn或者重新登录建立新的会话,以使PostgreSQL重新编译该函数。要想规避此类问题的发生,在重建my_function时可以使用CREATEORREPLACEFUNCTION命令。   鉴于以上规则,在PL/pgSQL里直接出现的SQL命令必须在每次执行时均引用相同的表和字段,换句话说,不能将函数的参数用作SQL命令的表名或字段名。如果想绕开该限制,可以考虑使用PL/pgSQL中的EXECUTE语句动态地构造

4、命令,由此换来的代价是每次执行时都要构造一个新的命令计划。   使用PL/pgSQL函数的一个非常重要的优势是可以提高程序的执行效率,由于原有的SQL调用不得不在客户端与服务器之间反复传递数据,这样不仅增加了进程间通讯所产生的开销,而且也会大大增加网络IO的开销。二、PL/pgSQL的结构:   PL/pgSQL是一种块结构语言,函数定义的所有文本都必须在一个块内,其中块中的每个声明和每条语句都是以分号结束,如果某一子块在另外一个块内,那么该子块的END关键字后面必须以分号结束,不过对于函数体的最后一个END关键字,分号可以省略,如:   [<

5、 [DECLAREdeclarations]   BEGIN      statements   END[label];   在PL/pgSQL中有两种注释类型,双破折号(--)表示单行注释。/**/表示多行注释,该注释类型的规则等同于C语言中的多行注释。   在语句块前面的声明段中定义的变量在每次进入语句块(BEGIN)时都会将声明的变量初始化为它们的缺省值,而不是每次函数调用时初始化一次。如:   CREATEFUNCTIONsomefunc()RETURNSintegerAS$$   DECLARE     quantityinteger:=30;   BEG

6、IN     RAISENOTICE'Quantityhereis%',quantity;    --在这里的数量是30     quantity:=50;     --     --创建一个子块     --http://www.qinglvfenzu.com     DECLARE        quantityinteger:=80;     BEGIN        RAISENOTICE'Quantityhereis%',quantity;  --在这里的数量是80     END;     RAISENOTICE'Quantityhereis%',qua

7、ntity;     --在这里的数量是50        RETURNquantity;   END;   $$LANGUAGEplpgsql;   #执行该函数以进一步观察其执行的结果。   postgres=#selectsomefunc();   NOTICE: Quantityhereis30   NOTICE: Quantityhereis80   NOTICE: Quantityhereis50   somefunc   ----------         50   (1row)   最后需要说明的是,目前版本的PostgreSQL并不支持嵌套事

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。