这篇文章主要讲解了“Oracle与Postgresql的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“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参数返回。
感谢各位的阅读,以上就是“Oracle与Postgresql的区别有哪些”的内容了,经过本文的学习后,相信大家对Oracle与Postgresql的区别有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程之家,小编将为大家推送更多相关知识点的文章,欢迎关注!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。