Nic*_*aro 12 sql postgresql stored-procedures
Postgres noobie在这里.
我正在尝试将SQL Server存储过程转换为Postgres函数.目前无法弄清楚如何将此SQL行转换为Postgres.
SQL Server:
input: @name = null
SELECT *
FROM table
WHERE name = ISNULL(@name, name)
Run Code Online (Sandbox Code Playgroud)
Postgres的:
input: n = null
SELECT *
FROM table
WHERE name = COALESCE(n, name)
Run Code Online (Sandbox Code Playgroud)
我收到错误"列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;
Run Code Online (Sandbox Code Playgroud)
dbe*_*hur 18
修订:正如评论中指出的那样,这个答案在2012年初编写时是准确的,但自2012年底发布的v9.2以来,已经支持命名参数.
当您的函数使用语言SQL时,参数名称仅仅是装饰.您可以在定义为的存储过程中按名称使用参数language plpgsql
.
因此,您必须使用$ X引用函数args,其中X是函数参数列表的序数位置(从1开始).
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;
Run Code Online (Sandbox Code Playgroud)
a_h*_*ame 12
您不能在使用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;
Run Code Online (Sandbox Code Playgroud)
手册中记录了此行为:http://www.postgresql.org/docs/9.0/static/xfunc-sql.html
就SQL函数本身而言,这些名称只是装饰; 你仍然必须在函数体中引用参数$ 1,$ 2等
编辑
从版本9.2开始,可以使用带有(普通)SQL函数的命名参数
http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS
归档时间: |
|
查看次数: |
29286 次 |
最近记录: |