加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:33:13 所属栏目:百科 来源:网络整理
导读:在数据库开发方面非常新,所以我对以下示例有一些疑问: 函数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
在数据库开发方面非常新,所以我对以下示例有一些疑问:

函数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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读