本篇内容主要讲解“Oracle与PostgreSQL内置的编程语言有什么不同”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle与PostgreSQL内置的编程语言有什么不同”吧!

Oracle和PostgreSQL都提供了内置的编程语言(PL/SQL vs PL/pgSQL),在输入输出参数的声明上有较大的不同,如输入参数中存在inout/out参数,Oracle的函数可以有返回值,但PG不允许有返回值,只能通过参数返回。

Oracle
创建函数

TEST-orcl@DESKTOP-V430TU3>CREATEorreplaceFUNCTIONsf_testparameter(p1varchar2,p2int,p3varchar2,p4inoutint)2RETURNvarchar23is4begin5p4:=1;6return'test';7end;8/Functioncreated.

执行

TEST-orcl@DESKTOP-V430TU3>selectsf_testparameter(null,null,null,:p4)fromdual;selectsf_testparameter(null,null,null,:p4)fromdual*ERRORatline1:ORA-06572:FunctionSF_TESTPARAMETERhasoutarguments

不能在SQL中执行,但可以在PL/SQL中执行

TEST-orcl@DESKTOP-V430TU3>setserveroutputonTEST-orcl@DESKTOP-V430TU3>declare2p4number;3retvarchar2(100);4begin5ret:=sf_testparameter(null,null,null,p4);6dbms_output.put_line('p4='||p4||',ret='||ret);7end;8/p4=1,ret=test

PostgreSQL
创建函数,参数中存在inout类型的参数,返回值必须与该参数类型一样,而且return不能返回实际值。

[local:/data/run/pg12]:5120pg12@testdb=#CREATEorreplaceFUNCTIONsf_testparameter(p1text,p2int,p3text,inoutp4int)pg12@testdb-#RETURNStextpg12@testdb-#AS$$pg12@testdb$#beginpg12@testdb$#return'test';pg12@testdb$#end;pg12@testdb$#$$LANGUAGE'plpgsql';ERROR:functionresulttypemustbeintegerbecauseofOUTparameters[local:/data/run/pg12]:5120pg12@testdb=#[local:/data/run/pg12]:5120pg12@testdb=#dropfunctionsf_testparameter;ERROR:couldnotfindafunctionnamed"sf_testparameter"[local:/data/run/pg12]:5120pg12@testdb=#CREATEorreplaceFUNCTIONsf_testparameter(p1text,p2int,p3text,inoutp4int)pg12@testdb-#RETURNSintpg12@testdb-#AS$$pg12@testdb$#beginpg12@testdb$#return1;pg12@testdb$#end;pg12@testdb$#$$LANGUAGE'plpgsql';ERROR:RETURNcannothaveaparameterinfunctionwithOUTparametersLINE5:return1;^[local:/data/run/pg12]:5120pg12@testdb=#[local:/data/run/pg12]:5120pg12@testdb=#CREATEorreplaceFUNCTIONsf_testparameter(p1text,p2int,p3text,inoutp4int)pg12@testdb-#RETURNSintpg12@testdb-#AS$$pg12@testdb$#beginpg12@testdb$#return;pg12@testdb$#end;pg12@testdb$#$$LANGUAGE'plpgsql';CREATEFUNCTION[local:/data/run/pg12]:5120pg12@testdb=#selectsf_testparameter(null,null,null,null);sf_testparameter------------------(1row)[local:/data/run/pg12]:5120pg12@testdb=#

如参数中有多个out参数,则要求返回record类型

[local:/data/run/pg12]:5120pg12@testdb=#dropfunctionsf_testparameter;IONsf_testparameter(p1text,p2int,p3text,inoutp4int,outp5text)RETURNSrecordAS$$beginreturn;end;$$LANGUAGE'plpgsql';\dfsf_testparameterselectsf_testparameter(null,null,null,null,null);selectsf_testparameter(null,null,null,null);DROPFUNCTION[local:/data/run/pg12]:5120pg12@testdb=#CREATEorreplaceFUNCTIONsf_testparameter(p1text,p2int,p3text,inoutp4int,outp5text)pg12@testdb-#RETURNStextpg12@testdb-#AS$$pg12@testdb$#beginpg12@testdb$#return'test';pg12@testdb$#end;pg12@testdb$#$$LANGUAGE'plpgsql';ERROR:functionresulttypemustberecordbecauseofOUTparameters[local:/data/run/pg12]:5120pg12@testdb=#[local:/data/run/pg12]:5120pg12@testdb=#dropfunctionsf_testparameter;ERROR:couldnotfindafunctionnamed"sf_testparameter"[local:/data/run/pg12]:5120pg12@testdb=#CREATEorreplaceFUNCTIONsf_testparameter(p1text,p2int,p3text,inoutp4int,outp5text)pg12@testdb-#RETURNSrecordpg12@testdb-#AS$$pg12@testdb$#beginpg12@testdb$#return;pg12@testdb$#end;pg12@testdb$#$$LANGUAGE'plpgsql';CREATEFUNCTION[local:/data/run/pg12]:5120pg12@testdb=#[local:/data/run/pg12]:5120pg12@testdb=#\dfsf_testparameterListoffunctions-[RECORD1]-------+------------------------------------------------------------Schema|publicName|sf_testparameterResultdatatype|recordArgumentdatatypes|p1text,p2integer,p3text,INOUTp4integer,OUTp5textType|func[local:/data/run/pg12]:5120pg12@testdb=#[local:/data/run/pg12]:5120pg12@testdb=#selectsf_testparameter(null,null,null,null,null);ERROR:functionsf_testparameter(unknown,unknown,unknown,unknown,unknown)doesnotexistLINE1:selectsf_testparameter(null,null,null,null,null);^HINT:Nofunctionmatchesthegivennameandargumenttypes.Youmightneedtoaddexplicittypecasts.[local:/data/run/pg12]:5120pg12@testdb=#selectsf_testparameter(null,null,null,null);sf_testparameter------------------(,)(1row)[local:/data/run/pg12]:5120pg12@testdb=#

不管有多少个out参数,都归为return参数,在调用时不需要作为参数输入,难怪PG要求返回record类型。

[local:/data/run/pg12]:5120pg12@testdb=#dropfunctionsf_testparameter;DROPFUNCTION[local:/data/run/pg12]:5120pg12@testdb=#CREATEorreplaceFUNCTIONsf_testparameter(p1text,p2int,p3text,inoutp4int,outp5text,outp6text)pg12@testdb-#RETURNSrecordpg12@testdb-#AS$$pg12@testdb$#beginpg12@testdb$#return;pg12@testdb$#end;pg12@testdb$#$$LANGUAGE'plpgsql';CREATEFUNCTION[local:/data/run/pg12]:5120pg12@testdb=#selectsf_testparameter(null,null,null,null);sf_testparameter------------------(,,)(1row)[local:/data/run/pg12]:5120pg12@testdb=#[local:/data/run/pg12]:5120pg12@testdb=#

到此,相信大家对“Oracle与PostgreSQL内置的编程语言有什么不同”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!