PostgreSQL函数中的语言sql和语言plpgsql的区别

前端之家收集整理的这篇文章主要介绍了PostgreSQL函数中的语言sql和语言plpgsql的区别前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
数据库开发方面非常新,所以我对以下示例有一些疑问:

函数f1() – 语言sql

create or replace function f1(istr  varchar) returns text as $$
 select 'hello! '::varchar || istr;
 $$language sql;

函数f2() – 语言plpgsql

create  or replace function f2(istr  varchar)
 returns text as $$
 begin select 'hello! '::varchar || istr; end;
 $$language plpgsql;

>这两个函数都可以像选择f1(‘world’)或者选择f2(‘world’)一样调用.
>如果我调用选择f1(‘world’),输出将是:

`hello! world`

>输出为f2(‘world’):

ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT,use PERFORM instead.
CONTEXT: PL/pgsql function f11(character varying) line 2 at sql statement
****** Error ******

>我想知道差异,在哪种情况下我应该使用语言sql或语言plpgsql.

关于功能的任何有用的链接或答案将不胜感激.

SQL functions

是更好的选择:

对于简单的标量查询没有太多的计划,更好地节省任何开销.
>对于每个会话的单个呼叫.没有什么可以从PL / pgsql提供的计划缓存和准备语句中获得.见下文.
>如果它们通常在更大的查询的上下文中调用,并且足够简单,可以内联.
>由于缺乏PL / pgsql等程序语言的经验.许多人都很熟悉sql,而且这就是sql函数所需要的全部.很少有关于PL / pgsql的说法.
>一个更短的代码.没有开销.

PL/pgSQL functions

是更好的选择:

>当您需要任何sql函数中不可用的过程元素或变量时,显然.
>对于任何类型的动态sql,您在哪里构建和EXECUTE语句动态.需要特别注意避免sql注入.更多细节:

> Postgres functions vs prepared queries

>当您有几个可以在多个地方重复使用的计算,并且CTE无法伸缩时.在sql函数中,您没有变量,将被强制重复计算或写入表. dba.SE中的相关答案具有并行代码示例,用于使用sql函数/ plpgsql函数/具有CTE的查询解决相同的问题:

> How to pass a parameter into a function

作业比其他程序语言要贵一些.调整不需要使用更多分配的编程风格.
>当一个函数不能内联并被重复调用时.与sql功能不同,query plans can be cached for all SQL statements inside a PL/pgSQL functions;它们被视为准备好的语句,该计划在同一会话中被缓存以重复调用(如果Postgres预期缓存(通用)计划的执行效果比每次都重新计划,这就是为什么PL / pgsql函数通常更快的原因在这种情况下的第一个电话.
线程上的pgsql性能讨论了以下这些项目:
Re: pl/pgsql functions outperforming sql ones?
>当你需要trap errors.
>对于trigger procedures(也只是功能).

还要考虑:

> PostgreSQL Stored Procedure Performance

猜你在找的Postgre SQL相关文章