- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PostgreSQL学习手册(PLpgSQL过程语言) .doc
一、概述:??? 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;?? ?在调用以上函数时,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 ];?? ?在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:? Quan
您可能关注的文档
- Non-singular terminal sliding-mode control of DC–DC buck converters .pdf
- non-verbal communication.ppt
- Nonlinear control with wind estimation of a DFIG variable speed wind turbine.pdf
- Nonlinear Current Control for Power Electronic Converters.pdf
- Nonlinear robust control of integrated vehicle dynamics刊出版.pdf
- NORSOK Surface preparation protective coating Rev5 Jun04.pdf
- Norsok_M-501-Surface_Preparation_and_Protective_Coating.pdf
- northwestern admission_contacts.pdf
- Not So SexyThe Health Risks of Secret Chemicals in Fragrance.pdf
- Novel interpenetrating network chitosan-poly(ethylene oxide-g-acrylamide.pdf
最近下载
- 一二三级配电箱原理图施工临电平面图.pdf
- 2025年中国机器人传感器行业发展监测及发展趋势预测报告.docx
- 2025年江西工业工程职业技术学院单招职业倾向性测试题库及参考答案.docx VIP
- 虫害管理培训材料.ppt
- 门窗安装安全技术交底.docx VIP
- 2023年凹版油墨的现状与发展趋势.pptx
- 专题五 模型或原型的制作 考向二 木工工艺 学案(含解析)2025届高中通用技术.DOCX VIP
- 中国药物性肝损伤诊治指南(2023年版)解读.pptx
- 《“双减”背景下家校协同培养学生动机的研究》课题研究方案.doc
- 安徽《既有多层住宅加装电梯技术标准》DB34T4249-2022.pdf
文档评论(0)