文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

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

可获得性

本特性自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
Copyright © 2011-2024 www.enmotech.com All rights reserved.