欢迎来到天天文库
浏览记录
ID:12183592
大小:44.00 KB
页数:10页
时间:2018-07-16
《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并不支持嵌套事
此文档下载收益归作者所有