暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MogDB 支持包内常量作为函数或者过程入参的默认值

原创 MogDB 2024-08-06
168

可获得性

本特性自MogDB 5.0.0版本开始引入。

特性简介

本特性支持包内常量作为函数或者过程入参的默认值。

客户价值

增强MogDB与Oracle的兼容性,减少应用程序的迁移代价。

特性约束

当前MogDB实现只能读取PACKAGE的包内常量赋值给函数入参。Oracle中,FUNCTION入参如果直接引用PACKAGE的变量,并且PACKAGE变量类型和FUNCTION入参类型不需要进行类型转换,那么修改PACKAGE变量的值会影响FUNCTION入参的值,入参如果引用的PACKAGE的变量的表达式,或者需要类型转换,修改PACKAGE变量的值不会影响FUNCTION入参的值。

根据Oracle的行为,如果FUNCTION/PROCEDURE的入参为直接引用PACKAGE的变量,并且类型不需要转换,那边修改PACKAGE变量的值会影响FUNCTION入参的值。

如果FUNCTION/PROCEDURE的入参PACKAGE的变量的表达式,或者类型需要转换。那边修改PACKAGE变量的值不会影响FUNCTION入参的值。

语法描述

函数或PROCEDURE入参的default value后引用了PACKAGE的包内常量。

FUNCTION test_func(input p1 DEFAULT pkg_name.aaa)

添加GUC参数proc_inparam_immutable,默认为true。

当前库为A库兼容模式,并且proc_inparam_immutable为true的情况下,MogDB入参只有IN类型才可以使用default value,并且FUNCTION/PROCEDURE中不能对入参进行修改,与ORACLE保持一致。 修改PACKAGE变量的值影响函数入参的行为和Oracle保持一致。

根据PG_CAST系统表,列出需要类型转换的列表。

通过下面语句,可以查询出source_type和target_type需要类型转换的列表。

SELECT pt1.typname AS source_type, pt2.typname AS target_type FROM pg_cast pc, pg_type pt1, pg_type pt2 WHERE pc.castsource = pt1.oid AND pc.casttarget = pt2.oid ORDER BY source_type;

示例

CREATE TABLE tlog( id number llevel number ); CREATE OR REPLACE package pkg_logparam IS default_level constant tlog.llevel%type :=70; --lerror END pkg_logparam; / CREATE OR REPLACE package pkg_mplog AS FUNCTION getLevelInText(pLevel tlog.llevel%type DEFAULT pkg_logparam.default_level) RETURN varchar; END pkg_mplog; / CREATE OR REPLACE package body pkg_mplog AS FUNCTION getLevelInText(pLevel tlog.llevel%type DEFAULT pkg_logparam.default_level) RETURN varchar IS BEGIN RETURN pLevel; END; END pkg_mplog; / SELECT pkg_mplog.getLevelInText(); getlevelintext ----------------- 70 (1 row) CREATE OR REPLACE package test_pkg_paraml IS v1 varchar2(4000) := 'old'; --包公共变量 v3 constant varchar2(4000) := 'old'; --包公共常量 PROCEDURE proc(p1 varchar2 DEFAULT v1, p3 varchar2 := v3 ); END; CREATE OR REPLACE package body test pkg_paraml IS v5 varchar2(4000) := 'old';--包私有变量 v7 constant varchar2(4000) := 'old';--包私有常量 PROCEDURE proc2(p1 varchar2 default v1, p3 varchar2 default v3, p5 varchar2 default v5, p7 varchar2 default v7) IS BEGIN raise notice 'v1:%, p1:%', v1, p1; raise notice 'v3:%, p3:%', v3, p3; raise notice 'v5:%, p5:%', v5, p5; raise notice 'v7:%, p7:%', v7, p7; raise notice '修改v5为new, v1之前已被修改'; v5 :='new'; raise notice 'v1:%, p1:%', v1, p1; raise notice 'v5:%, p5:%', v5, p5; END; PROCEDURE proc(p1 varchar2 DEFAULT v1, p3 varchar2 DEFAULT v3) IS BEGIN raise notice '---proc begin'; raise notice 'v1:%, p1:%', v1, p1; raise notice 'v3:%, p3:%', v3, p3; raise notice '修改v1为new'; v1 := 'new'; raise notice 'v1:%, p1:%', v1, p1; raise notice '--- proc1 begin'; raise notice '--- proc1 begin'; raise notice '--- proc end'; END; END; BEGIN raise notice '---------------------'; test_pkg_paraml.proc; raise notice '---------------------'; test_pkg_paraml.proc('0', '0'); END; / NOTICE: ---------------------------- NOTICE: --- proc begin NOTICE: v1:old, p1:old NOTICE: v3:old, p3:old NOTICE: 修改v1为new NOTICE: vl:new, p1:old NOTICE: --- proc1 begin NOTICE: --- proc1 begin NOTICE: --- proc end NOTICE: ---------------------------- NOTICE: --- proc begin NOTICE: vl:new, p1:0 NOTICE: v3:old, p3:0 NOTICE: 修改v1为new NOTICE: vl:new, p1:0 NOTICE: --- proc1 begin NOTICE: --- proc1 begin NOTICE: --- proc end
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论