PostgreSQL 11 - 程序
PostgreSQL 11 - Procedures
随着PostgreSQL配套程序的最新更新。官方博客,引用的是"As opposed to functions, procedures are not required to return a value." (https://blog.2ndquadrant.com/postgresql-11-server-side-procedures-part-1/)
所以我的问题是,实际上有什么方法可以 return 程序中的错误代码或响应吗? (过程在 Postgres 中是相当新的,因此在线资源很少。)
这是我所说的 returning 这些 "error codes"
的一个例子
create or replace PROCEDURE multislot_Update_v1
(
p_id in varchar2,
p_name in varchar2,
p_enname in varchar2,
results out SYS_REFCURSOR
) AS
rowNumber int;
defaultNumber int;
BEGIN
select count(1) into rowNumber from MULTISLOTSGAME where fid=P_id;
if (rowNumber = 0) then
open results for
select '1' as result from dual;
return;
end if;
update MULTISLOTSGAME set
name = P_name,
enname = P_enname
where fid = P_id ;
commit;
open results for
select '0' as result, t1.* from MULTISLOTSGAME t1 where fid = p_id;
END multislot_Update_v1;
以上脚本是一个 Oracle 过程,如您所见,returned 结果是否为“1”,则表示更新不成功。
有什么办法可以将上述脚本(带有错误代码)编写为 PostgresSQL 过程吗?也许使用 "INOUT" 参数的例子会很棒!
使用 RAISE 语句怎么样?
https://www.postgresql.org/docs/10/static/plpgsql-errors-and-messages.html
过程中可以有 INOUT
个参数。
您使用 CALL
语句调用过程;如果有任何 INOUT
参数,该语句将 return 一个结果行,就像 SELECT
.
这是一个使用 return 是 refcursor
的过程的示例:
CREATE PROCEDURE testproc(INOUT r refcursor) LANGUAGE plpgsql AS
$$BEGIN
r := 'cur';
OPEN r FOR VALUES (1), (42), (12321);
END;$$;
BEGIN;
CALL testproc(NULL);
r
-----
cur
(1 row)
FETCH ALL FROM cur;
column1
---------
1
42
12321
(3 rows)
COMMIT;
随着PostgreSQL配套程序的最新更新。官方博客,引用的是"As opposed to functions, procedures are not required to return a value." (https://blog.2ndquadrant.com/postgresql-11-server-side-procedures-part-1/)
所以我的问题是,实际上有什么方法可以 return 程序中的错误代码或响应吗? (过程在 Postgres 中是相当新的,因此在线资源很少。)
这是我所说的 returning 这些 "error codes"
的一个例子create or replace PROCEDURE multislot_Update_v1
(
p_id in varchar2,
p_name in varchar2,
p_enname in varchar2,
results out SYS_REFCURSOR
) AS
rowNumber int;
defaultNumber int;
BEGIN
select count(1) into rowNumber from MULTISLOTSGAME where fid=P_id;
if (rowNumber = 0) then
open results for
select '1' as result from dual;
return;
end if;
update MULTISLOTSGAME set
name = P_name,
enname = P_enname
where fid = P_id ;
commit;
open results for
select '0' as result, t1.* from MULTISLOTSGAME t1 where fid = p_id;
END multislot_Update_v1;
以上脚本是一个 Oracle 过程,如您所见,returned 结果是否为“1”,则表示更新不成功。
有什么办法可以将上述脚本(带有错误代码)编写为 PostgresSQL 过程吗?也许使用 "INOUT" 参数的例子会很棒!
使用 RAISE 语句怎么样?
https://www.postgresql.org/docs/10/static/plpgsql-errors-and-messages.html
过程中可以有 INOUT
个参数。
您使用 CALL
语句调用过程;如果有任何 INOUT
参数,该语句将 return 一个结果行,就像 SELECT
.
这是一个使用 return 是 refcursor
的过程的示例:
CREATE PROCEDURE testproc(INOUT r refcursor) LANGUAGE plpgsql AS
$$BEGIN
r := 'cur';
OPEN r FOR VALUES (1), (42), (12321);
END;$$;
BEGIN;
CALL testproc(NULL);
r
-----
cur
(1 row)
FETCH ALL FROM cur;
column1
---------
1
42
12321
(3 rows)
COMMIT;