Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Postgres plpgsql自定义函数转换为语言SQL自定义函数?_Sql_Postgresql_Plpgsql - Fatal编程技术网

如何将Postgres plpgsql自定义函数转换为语言SQL自定义函数?

如何将Postgres plpgsql自定义函数转换为语言SQL自定义函数?,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,我的理解是,在Postgres数据库中,我们可以编写SQL风格的用户创建函数和PlpgSQL风格的用户创建函数。他们应该能够从一个翻译到另一个。首先,我在概念上错了吗 以下是一个例子: 我试图转换以下代码: CREATE OR REPLACE FUNCTION getNthHighestSalary(N integer) RETURNS integer AS $$ BEGIN return ( select distinct salary from employee or

我的理解是,在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
);

如果您想使用
语言SQL
,那么您必须做一些更改

首先是去掉
开始
结束

第二种方法是简单地声明
SELECT
查询,而不使用
RETURN
关键字

还有一些其他问题:您应该
按薪资描述排序
,返回类型是
数值
,而不是
整数
,您需要转义
字符,因此使用
$$
将其括起来,就像执行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;


如果您想使用
语言SQL
,那么您必须做一些更改

首先是去掉
开始
结束

第二种方法是简单地声明
SELECT
查询,而不使用
RETURN
关键字

还有一些其他问题:您应该
按薪资描述排序
,返回类型是
数值
,而不是
整数
,您需要转义
字符,因此使用
$$
将其括起来,就像执行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;


什么是标准SQL函数?ANSI标准没有定义SQL函数。没有标准的SQL函数。每个支持SQL函数的DBMS供应商都有自己的语法来创建它们。@Andreas,谢谢您的回答。我只是稍微修改了一下瓷砖。很抱歉给你带来了困惑。我指的是用户定义的函数。不是本机函数。ie:由CREATEFUNCTION语句创建的函数。什么是标准的SQL函数?ANSI标准没有定义SQL函数。没有标准的SQL函数。每个支持SQL函数的DBMS供应商都有自己的语法来创建它们。@Andreas,谢谢您的回答。我只是稍微修改了一下瓷砖。很抱歉给你带来了困惑。我指的是用户定义的函数。不是本机函数。ie:由CREATEFUNCTION语句创建的。回答得很好!非常感谢!回答得好!非常感谢!