【问题标题】:How to convert Postgres plpgsql user-defined function to LANGUAGE SQL user-defined function?如何将 Postgres plpgsql 用户定义函数转换为 LANGUAGE SQL 用户定义函数?
【发布时间】:2020-07-23 03:25:47
【问题描述】:

我的理解是,在 Postgres 数据库中,我们可以编写 SQL 风格的用户创建函数和 PlpgSQL 风格的用户创建函数。他们应该能够从一个翻译到另一个。首先,我在概念上错了吗?

这是一个例子:

我试图在下面转换这样的代码:

CREATE OR REPLACE FUNCTION getNthHighestSalary(N integer) RETURNS integer
AS $$
BEGIN
return (
    select distinct salary
    from employee
    order by salary
    limit 1 offset $1-1);
END;$$ LANGUAGE plpgsql;

变成类似:

CREATE OR REPLACE FUNCTION getNthHighestSalary(N integer) RETURNS integer
AS
BEGIN
return (
    select distinct salary
    from employee
    order by salary
    limit 1 offset $1-1);
END; LANGUAGE SQL;

无论我如何尝试,我转换成的代码都无法在 Postgres 数据库中运行,并且总是抛出奇怪的语法错误。

那么如何将上面的代码转换为能够在 Postgres 数据库中运行的可行标准 SQL 函数?特别是请解释问题出在哪里以及 Postgres 数据库环境中标准 SQL 和 Plpgsql 语法之间的主要区别是什么。非常感谢

顺便说一句,这里是创建测试表和插入测试数据的代码:

create table Employee
(
id varchar(255) PRIMARY KEY,
Salary numeric
);
insert into Employee values('1',100),('2',200),('3',300);

【问题讨论】:

  • 什么是标准 SQL 函数? ANSI 标准没有定义 SQL 函数。没有标准 SQL 函数之类的东西。每个支持 SQL 函数的 DBMS 供应商都有自己的语法来创建它们。
  • @Andreas,感谢您的回答。我只是稍微修改了瓷砖。对困惑感到抱歉。我的意思是用户定义的函数。不是本机功能。即:由 CREATE FUNCTION 语句创建的那些。

标签: sql postgresql plpgsql


【解决方案1】:

如果您想使用LANGUAGE SQL,那么您必须进行一些更改。

首先是去掉BEGINEND

其次是简单地声明 SELECT 查询而不使用 RETURN 关键字。

还有一些其他问题:你应该order by salary desc,返回类型是numeric而不是integer,你需要转义;字符,所以在你做的时候用$$括起来plpgsql 函数。

CREATE OR REPLACE FUNCTION getNthHighestSalary(N integer) RETURNS numeric
AS $$
    select distinct salary
      from employee
     order by salary desc
     limit 1 offset $1-1;
$$ LANGUAGE SQL;

【讨论】:

  • 很好的答案!非常感谢!
猜你喜欢
  • 2016-02-26
  • 1970-01-01
  • 2012-07-25
  • 2018-06-30
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多