ITPub博客

首页 > 数据库 > PostgreSQL > Oracle vs PostgreSQL Develop(27) - PLSQL vs PLPGSQL(输出参数)

Oracle vs PostgreSQL Develop(27) - PLSQL vs PLPGSQL(输出参数)

原创 PostgreSQL 作者:husthxd 时间:2020-02-14 17:49:25 0 删除 编辑

Oracle的PL/SQL存储过程或者函数,可以支持多个输出参数,而且参数类型可以不同,但PostgreSQL虽然可以支持多个输出参数,但参数类型要求一致。对于Function,如存在out参数,Oracle可支持返回值,但PostgreSQL不支持。

Oracle

SQL> CREATE OR REPLACE function func_out(pi_in NUMBER,pi_out1 out number,pi_out2 out varchar2)
  2  return date
  3  as
  4    v_date date;
  5  begin
  6    v_date := sysdate;
  7    pi_out1 := pi_in;
  8    pi_out2 := pi_in;
  9    return v_date;
 10  end;
 11  /
函数已创建。
SQL>
SQL> set serveroutput on
SQL> declare
  2    v_date date;
  3    v_out1 number;
  4    v_out2 varchar2(200);
  5  begin
  6    v_date := func_out(1,v_out1,v_out2);
  7    dbms_output.put_line('v_date = '||v_date||';v_out1 = '||v_out1||';v_out2 = '||v_out2);
  8  end;
  9  /
v_date = 14-2月 -20;v_out1 = 1;v_out2 = 1
PL/SQL 过程已成功完成。
SQL>

输出参数分别是number、varchar2,函数返回date类型。

PostgreSQL

[local:/data/run/pg12]:5120 pg12@testdb=# CREATE OR REPLACE function func_out(pi_in int,pi_out1 out int,pi_out2 out text) 
pg12@testdb-# returns date
pg12@testdb-# as
pg12@testdb-# $$
pg12@testdb$# declare
pg12@testdb$#   v_date date;
pg12@testdb$# begin 
pg12@testdb$#   v_date := current_date();
pg12@testdb$#   pi_out1 := pi_in;
pg12@testdb$#   pi_out2 := to_char(pi_in);
pg12@testdb$#   return v_id; 
pg12@testdb$# end;
pg12@testdb$# $$ LANGUAGE 'plpgsql';
ERROR:  function result type must be record because of OUT parameters
[local:/data/run/pg12]:5120 pg12@testdb=#

提示结果类型必须为record

[local:/data/run/pg12]:5120 pg12@testdb=# CREATE OR REPLACE function func_out(pi_in int,pi_out1 out int,pi_out2 out text) 
pg12@testdb-# returns record
pg12@testdb-# as
pg12@testdb-# $$
pg12@testdb$# declare
pg12@testdb$#   v_date date;
pg12@testdb$# begin 
pg12@testdb$#   v_date := current_date;
pg12@testdb$#   pi_out1 := pi_in;
pg12@testdb$#   pi_out2 := to_char(pi_in);
pg12@testdb$#   return null; 
pg12@testdb$# end;
pg12@testdb$# $$ LANGUAGE 'plpgsql';
ERROR:  RETURN cannot have a parameter in function with OUT parameters
LINE 11:   return null; 
                  ^
[local:/data/run/pg12]:5120 pg12@testdb=#

改为record后,返回null值,提示如存在OUT参数不允许返回值。

[local:/data/run/pg12]:5120 pg12@testdb=# CREATE OR REPLACE function func_out(pi_in int,pi_out1 out int,pi_out2 out text) 
pg12@testdb-# returns record
pg12@testdb-# as
pg12@testdb-# $$
pg12@testdb$# declare
pg12@testdb$#   v_date date;
pg12@testdb$# begin 
pg12@testdb$#   v_date := current_date;
pg12@testdb$#   pi_out1 := pi_in;
pg12@testdb$#   pi_out2 := pi_in;
pg12@testdb$#   return; 
pg12@testdb$# end;
pg12@testdb$# $$ LANGUAGE 'plpgsql';
CREATE FUNCTION
[local:/data/run/pg12]:5120 pg12@testdb=#

创建成功,尝试调用

[local:/data/run/pg12]:5120 pg12@testdb=# do
pg12@testdb-# $$
pg12@testdb$# declare
pg12@testdb$#   v_ret record;
pg12@testdb$#   v_out1 int;
pg12@testdb$#   v_out2 text;
pg12@testdb$# begin
pg12@testdb$#   v_ret := func_out(1,v_out1,v_out2);
pg12@testdb$#   raise notice 'ret is : %d',v_ret;
pg12@testdb$# end
pg12@testdb$# $$
pg12@testdb-# ;
ERROR:  function func_out(integer, integer, text) does not exist
LINE 1: SELECT func_out(1,v_out1,v_out2)
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
QUERY:  SELECT func_out(1,v_out1,v_out2)
CONTEXT:  PL/pgSQL function inline_code_block line 7 at assignment
[local:/data/run/pg12]:5120 pg12@testdb=#

提示没有相应的函数,原因是PG会忽略OUT参数,把out参数去掉重新调用

[local:/data/run/pg12]:5120 pg12@testdb=# do
pg12@testdb-# $$
pg12@testdb$# declare
pg12@testdb$#   v_ret record;
pg12@testdb$#   v_out1 int;
pg12@testdb$#   v_out2 text;
pg12@testdb$# begin
pg12@testdb$#   v_ret := func_out(1);
pg12@testdb$#   raise notice 'ret is : %',v_ret;
pg12@testdb$# end
pg12@testdb$# $$;
NOTICE:  ret is : (1,1)
DO
[local:/data/run/pg12]:5120 pg12@testdb=# 
[local:/data/run/pg12]:5120 pg12@testdb=#

返回的是record,第一个值为1,第二个值为1

1.PG会忽略输出参数,判断一个函数是否是同一个函数,仅判断输入参数;2.如存在OUT参数,PG函数无法返回结果,只能通过OUT参数返回

参考资料
N/A

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-2675626/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
ITPUB数据库版块资深版主,对Oracle、PostgreSQL有深入研究。

注册时间:2007-12-28

  • 博文量
    1490
  • 访问量
    3927721