如何将postgres plpgsql用户定义函数转换为语言sql用户定义函数?

zvokhttg  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(280)

我的理解是,在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数据库中都不起作用,而且总是抛出奇怪的语法错误。
那么,如何将上面的代码转换成一个可行的标准sql函数,该函数能够在postgres数据库中运行呢?请特别说明问题出在哪里,以及在postgres数据库环境中标准sql和plpgsql语法的主要区别是什么。谢谢
顺便说一句,下面是创建测试表和插入测试数据的代码:

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

mqkwyuun1#

如果你想用 LANGUAGE SQL ,那么您需要做一些更改。
首先是摆脱 BEGIN 以及 END .
第二是简单地陈述 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;

相关问题