Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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 sql函数中引用命名参数?_Sql_Postgresql_Stored Procedures - Fatal编程技术网

如何在Postgres sql函数中引用命名参数?

如何在Postgres sql函数中引用命名参数?,sql,postgresql,stored-procedures,Sql,Postgresql,Stored Procedures,这里是博士后餐厅 我正在尝试将SQL Server存储过程转换为Postgres函数。目前无法确定如何将此SQL行转换为Postgres SQL Server: input: @name = null SELECT * FROM table WHERE name = ISNULL(@name, name) 博士后: input: n = null SELECT * FROM table WHERE name = COALESCE(n, name) 我得到错误“n列不存在”。如何在Post

这里是博士后餐厅

我正在尝试将SQL Server存储过程转换为Postgres函数。目前无法确定如何将此SQL行转换为Postgres

SQL Server:

input: @name = null

SELECT *
FROM table
WHERE name = ISNULL(@name, name)
博士后:

input: n = null

SELECT *
FROM table
WHERE name = COALESCE(n, name)
我得到错误“n列不存在”。如何在Postgres函数的select语句中引用参数

更新:

Postgres函数的定义

CREATE OR REPLACE FUNCTION fn_name (n VARCHAR(32) = NULL, name OUT varchar(32), description OUT varchar(64))
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE(n, u.name);

$$
LANGUAGE sql;

不能在用language=SQL定义的函数中使用命名参数

您需要使用占位符$1

CREATE OR REPLACE FUNCTION fn_name (n VARCHAR(32) = NULL, name OUT varchar(32), description OUT varchar(64))
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE($1, u.name);

$$
LANGUAGE sql;
该行为记录在手册中:

就SQL函数本身而言,这些名称只是装饰;您仍然必须在函数体中将参数引用为$1、$2等

编辑

从9.2版开始,可以将命名参数与(普通)SQL函数一起使用

修订版:正如评论中所指出的,这个答案在2012年初编写时是准确的,但命名参数自2012年底发布的v9.2版本以来就得到了支持

当函数在中时,参数名只是装饰。您可以在定义为
语言plpgsql
的存储过程中按名称使用参数

因此,必须使用$X引用函数args,其中X是函数参数列表的序号位置(从1开始)


根据@a_horse_和_no_name在另一个答案上的观点,命名支持自9.2以来一直存在
CREATE OR REPLACE FUNCTION fn_name (
  n VARCHAR(32) = NULL,
  OUT name varchar(32),
  OUT description varchar(64) )
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE($1, u.name);
$$
LANGUAGE sql;