我在 * 数据库开发 * 方面很新,所以我对下面的例子有一些疑问:
函数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;
型
- 这两个 * 函数 * 都可以像
select f1('world')
或select f2('world')
那样调用。 - 如果我调用
select f1('world')
,* 输出 * 将是:
`hello! world`
型
select f2('world')
的 output:
错误代码:查询没有结果数据的目标提示:如果要放弃SELECT的结果,请改用PERFORM。上下文:PL/pgSQL函数f11(字符变化)SQL语句第2行 * 错误**
- 我想知道区别,以及在哪些情况下我应该使用
language sql
或language plpgsql
。
任何有用的链接或有关功能的答案将不胜感激。
4条答案
按热度按时间q7solyqu1#
SQL functions第一个字符
...是更好的选择:
PL/pgSQL functions(第一对)
...是更好的选择:
EXECUTE
叙述句。需要特别注意,以避免SQL内建。详细信息:赋值比其他过程语言的开销要大一些,所以要采用一种不使用过多赋值的编程风格。
下面是一个关于pgsql-performance的线程,讨论了其中的一些项目:
还应考虑:
要从PL/pgSQL函数中实际 return,可以编写以下语句:
字符串
还有其他方法:
koaltpgm2#
PL/PgSQL is a PostgreSQL-specific procedural language based on SQL。它有循环,变量,错误/异常处理等。不是所有的SQL都是有效的PL/PgSQL -正如你所发现的,例如,你不能在没有
INTO
或RETURN QUERY
的情况下使用SELECT
。PL/PgSQL也可以在DO
块中用于一次性过程。sql
functions只能使用纯SQL,但它们通常更有效,编写更简单,因为您不需要BEGIN ... END;
块等。SQL函数可能是内联的,但PL/PgSQL不是这样。人们经常使用PL/PgSQL,而普通SQL就足够了,因为他们习惯于按程序思考。在大多数情况下,当你认为你需要PL/PgSQL时,你可能实际上并不需要。递归CTE,横向查询等通常可以满足大多数需求。
有关更多信息,请参阅手册。
dddzy1tm3#
只需将您在函数中编写的select查询作为返回值:
字符串
qvsjd97n4#
A SQL function:
AS
子句,或者BEGIN ATOMIC ... END clause从调用者那里获得零个或多个值,带有零个或多个参数。*BEGIN ATOMIC ... END
子句根据the doc仅适用于LANGUAGE SQL
。IN
,OUT
,INOUT
和VARIADIC
参数。* 我的答案解释了一个VARIADIC参数。$1
,$2
等的别名。* 我的答案解释了这一点。AS
子句或BEGIN ATOMIC ... END
子句将最后一个语句的值返回给具有SELECT statement和RETURNING clause的调用者。AS
子句或BEGIN ATOMIC ... END
子句。BEGIN ... END
子句,它可以有多个SQL查询,否则会有错误,而PL/pgSQL函数可以有它。* 小心,BEGIN ... END
子句不是transaction。START TRANSACTION
,BEGIN
,ROLLBACK
,COMMIT
等的交易,否则会出现错误。A PL/pgSQL function:
BEGIN ... END
语句的SQL查询,从调用者那里获得零个或多个带有零个或多个参数的值。* 请注意,BEGIN ... END
子句不是transaction。IN
,OUT
,INOUT
和VARIADIC
参数。* 我的答案解释了一个VARIADIC
参数。DECLARE
子句声明局部变量。$1
,$2
等的别名。* 我的答案解释了这一点。INTO
和RETURNING clause否则有错误。OUT
或INOUT
参数返回一个值给调用者。START TRANSACTION
,BEGIN
,ROLLBACK
,COMMIT
等的交易,否则会出错。