VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

Oracle兼容性参数

enable_proc_param_name_override

参数说明: 控制重载包函数时,是否对参数名进行检查。

该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。

该参数仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。

取值范围: 布尔型

  • on:重载包函数时包含对参数名的检查。用户调用包函数时不指定入参名称则调用函数失败,指定入参名称则调用函数成功。
  • off:重载包函数时不包括对参数名的检查。

默认值: off

示例:

示例1: 在参数名相同,参数类型不同,返回类型相同的存储过程中,传入列名。

1、开启enable_proc_param_name_override参数,重载包函数时包含对参数名的检查。

set enable_proc_param_name_override=on;

2、设置guc参数behavior_compat_options。

set behavior_compat_options='';

3、创建测试表并插入数据。

create schema tpcds;
create table tpcds.t1_over(id int,name varchar2);
insert into tpcds.t1_over values(1,'abc');

4、创建参数名相同,参数类型不同,返回类型相同的包内存储过程。

create or replace package pkg2 IS
FUNCTION f2(p_in1 int,p_out in int) RETURN varchar2;
FUNCTION f2(p_in1 int,p_out in varchar2) RETURN varchar2;
end pkg2;
/
create or replace package body pkg2 IS
function f2(p_in1 int,p_out in int) RETURN varchar2
as
begin
p_in1:=p_in1*2;
return concat('000',p_in1::money);
end;
function f2(p_in1 int,p_out in varchar2) RETURN varchar2
as
begin
p_in1:=p_in1/2;
return concat('aaa',p_out);
end;
end pkg2;
/

5、查询包内存储过程,传入列名。

select pkg2.f2('20',id) from tpcds.t1_over;
select pkg2.f2('20',name) from tpcds.t1_over;

查询结果分别为:

000$40.00

aaaabc

示例2:参数名相同,参数类型不同,返回类型相同的存储过程,传入in/inout。

1、开启enable_proc_param_name_override参数,重载包函数时包含对参数名的检查。

set enable_proc_param_name_override=on;

2、设置guc参数behavior_compat_options。

set behavior_compat_options='';

3、创建带函数的包。

create or replace package pkg2 IS
FUNCTION f2(p_in1 int,p_out inout int) RETURN varchar2;
FUNCTION f2(p_in1 int,p_out in money) RETURN varchar2;
end pkg2;
/

4、创建包体。

create or replace package body pkg2 IS
function f2(p_in1 int,p_out inout int) RETURN varchar2
as
begin
p_in1:=p_in1*2;
return concat('000',p_in1::money);
end;
function f2(p_in1 int,p_out in money) RETURN varchar2
as
begin
p_in1:=p_in1/2;
return concat('aaa',p_in1::money+p_out);
end;
end pkg2;
/

5、调用包内函数。

select pkg2.f2(p_in1=>20,p_out=>2);

返回结果为:

f2
---------------------
000$40.00

(1 row)
  • 用户调用包函数时,不指定函数存在差异的参数名或使用语法不规范则调用失败。
  • GUC参数behavior_compat_options='proc_outparam_override'时,由于包内函数不允许重载out参数,则在包内创建同名且有out参数的函数时就会报错。

vbplsql_check

参数说明: 在创建PL/SQL对象时,是否进行语义检查。检查功能如下:

  • 创建函数需要返回非void时候,判断程序是否有return返回值,如果没有return返回值则创建失败,涉及到的statement有if、case语句。

  • 字符串拼接如果使用的双引号进行字符串拼接,则创建对象失败。

  • 如果DML语句中出现表不存在的情况,则创建对象失败,不包含动态执行语句。

  • 如果DML语句出现语法错误的情况,则创建对象失败,不包含动态执行语句。

GUC参数 vbplsql_check和enable_global_plancache 不能同时设置为on,否则会出现报错,设置失败。

该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围: 布尔型

  • on:在创建PL/SQL对象时,开启语义检查功能。
  • off:在创建PL/SQL对象时,关闭语义检查功能。

默认值: off

示例:

前置步骤: 设置GUC参数vbplsql_check =on。

set vbplsql_check = on;

示例1:创建触发器,判断是否有return返回。

1、创建测试表。

create table t1_z(w1 date);

2、创建函数。

CREATE OR REPLACE FUNCTION tri_func() RETURNS TRIGGER AS
$$
DECLARE
BEGIN
raise notice 'trigger begin: TG_OP is %',TG_OP;
if TG_OP='INSERT' then
insert into t1_z values('2022-05-19'::date+1);
end if;
END $$ LANGUAGE 'plpgsql';

返回结果如下,则表示函数创建成功:

CREATE FUNCTION

3、创建触发器。

CREATE TRIGGER be_tri
BEFORE INSERT OR DELETE OR UPDATE
ON t1_z
FOR EACH ROW
EXECUTE PROCEDURE tri_func();

创建触发器失败,提示缺少返回值,返回结果如下:

ERROR:  control reached end of function without RETURN

示例2:存储过程-DML语句中出现表不存在的情况,则创建对象失败。

1、创建存储过程。

create or replace procedure func()
as
declare
begin
insert into t1_z values(to_date('2022-05-19 135623.123','YYYY-MM-DD HH24MISS.FF'));
end;
/

存储过程创建失败,提示表不存在,返回结果如下:

ERROR:  relation "t1_z" does not exist on node1
LINE 1: insert into t1_z values(to_date('2022-05-19 135623.123','YYY...
                    ^
QUERY:  insert into t1_z values(to_date('2022-05-19 135623.123','YYYY-MM-DD HH24MISS.FF'))

2、调用存储过程。

select func();

调用存储过程失败,提示不存在,返回结果如下:

ERROR:  function func() does not exist
LINE 1: select func();
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
CONTEXT:  referenced column: func

示例3:存储过程-DML语句出现语法错误,则创建对象失败。

1、创建测试表。

create table t1_z(col1 date);

2、创建存储过程(其中insert语句语法错误)。

create or replace procedure func()
as
begin
insert into t1_z ('2022-05-19');
end;
/

存储过程创建失败,提示语法错误,返回结果如下:

ERROR:  syntax error at or near "'2022-05-19'"
LINE 3: insert into t1_z ('2022-05-19');
                          ^
QUERY:   DECLARE
begin
insert into t1_z ('2022-05-19');
end

result_case_mode

参数说明: 用于控制返回字段名的大小写。当用户在CREATE TABLEALTER TABLE、SELECT INTO等语句时,指定的列字段名称显式的被双引号包含,则在SELECT语句的输出结果中,列字段名称的大小写与引号内的内容保持一致。

该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。

  • 该参数只影响返回字段名的大小写形式,不影响Vastbase原有的大小写匹配逻辑。
  • 不支持在postgresql.conf文件中配置该参数,可能导致严重问题,仅支持在会话中配置。

取值范围: 枚举类型

  • lower:参数初始化取值,未使用引号指定的字段名及别名返回纯小写形式,否则返回引号指定形式。
  • upper:未使用引号指定的字段名及别名返回纯大写形式,否则返回引号指定形式。

默认值: lower

示例:

1、数据库初始化和用户与数据库建立连接后配置result_case_mode的值为upper。

set result_case_mode="upper";

2、查看参数值。

show result_case_mode;

返回结果为:

 result_case_mode
---------------------------
 upper
(1 row)

3、创建测试表。

create table test(aa int,"bb" int,Dd int,"Ee" int);

4、查询字段名带引号的结果。

select * from test;

返回结果为如下,其中被双引号包含的字段保持其大小写格式,未被包含的字段均变为大写:

 AA | bb | DD | Ee
----+----+----+----
(0 rows)

vb_max_dbms_locks

参数说明: 该参数用于指定dbms_lock的最大数量,常用于减少共享内存的使用。

该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围: 整型,32~262143

默认值: 3072

nls_date_format

参数说明: 该参数用于指定时间格式。

该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围: 合法的时间格式字符串

默认值:

enable_ignore_ident_case

参数说明: 为了对Oracle的大小写解析特性进行兼容,Vastbase提供了参数enable_ignore_ident_case用于控制双引号内标识符的大小写解析逻辑。

该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围: 布尔型

  • on:语法解析阶段,表名、字段名等标识符会被置为小写。

  • off:语法解析阶段,不对大小写进行处理,根据原始逻辑进行解析。

默认值: off

  • 当enable_ignore_ident_case=on时,其作用效果与result_case_mode = upper的作用效果存在冲突,不建议这样使用。 二者的冲突在于result_case_mode要求返回值必须与引号内的输入一致,但enable_ignore_ident_case为on时引号内的输入都返回小写。

  • 下表对比展示了enable_ignore_ident_case参数的效果:

    数据库类型双引号输入解析
    Oracle小写小写
    大写大写
    Vastbase
    (enable_ignore_ident_case=on)
    小写小写
    大写小写
    Vastbase
    (enable_ignore_ident_case=off)
    小写小写
    大写大写

示例1

  • enable_ignore_ident_case为off时(默认):

    1、创建测试表并插入数据。表名、字段名使用小写字母,无双引号。

    create table name(id int, col text);
    insert into name values(1001,'vastbase');
    

    2、使用大写字母进行查询,对比是否使用双引号的区别。

    select ID,COL from NAME;        --大写字母,无双引号
    select "ID","COL" from "NAME";  --大写字母,有双引号
    

    无双引号时,查询成功:

    id    |   col
    ------+----------
    1001  | vastbase
    (1 row)
    

    使用带双引号的大写字母,查询失败。报错信息如下:

    ERROR:  relation "NAME" does not exist on node1
    LINE 1: select "ID","COL" from "NAME";
                                ^
    
  • enable_ignore_ident_case为on时:

    set enable_ignore_ident_case = on;
    

    1、创建测试表并插入数据。表名、字段名使用小写字母,无双引号。

    create table book(id int, author text);
    insert into book values(10976458,'MoYan');
    

    2、使用大写字母进行查询,对比是否使用双引号的区别。

    select ID,AUTHOR from BOOK;        --大写字母,无双引号
    select "ID","AUTHOR" from "BOOK";  --大写字母,有双引号
    

    开启参数后,标识符即使被双引号包裹,但仍被解析为小写字母,能够成功查询。上述两条查询语句的返回结果依次为:

        id    | author
    ----------+--------
    10976458  | MoYan
    (1 row)
    
        id    | author
    ----------+--------
    10976458  | MoYan
    (1 row)
    

    注意,若在开启参数前,已在数据库中创建了名为“BOOK”的表(解析为大写),那么开启参数后,则无法使用“BOOK”去匹配该表(解析为小写),为了避免此类情况的发生,请注意设置参数的时机。参考示例2

示例2

1、当参数enable_ignore_ident_case为off时(默认):

set enable_ignore_ident_case=off;
show enable_ignore_ident_case;

2、创建测试表并插入数据。表名使用双引号包围的大写字母。

create table "BOOK"(id int, name text);

3、向测试表插入数据并查看测试表内容,需使用双引号包围的大写字母。

insert into "BOOK" values(1001,'TheLittlePrince');
select * from "BOOK";

能够正常插入和查询,返回结果如下:

  id  |      name
------+-----------------
 1001 | TheLittlePrince
(1 row)

4、此时设置参数enable_ignore_ident_case为on:

set enable_ignore_ident_case=on;

5、再次向测试表插入数据时,以下写法均无法匹配之前创建的”BOOK”表:

insert into "BOOK" values (1003,'HarryPotter');
insert into BOOK values (1003,'HarryPotter');
insert into book values (1003,'HarryPotter');

均得到如下报错信息:

ERROR:  relation "book" does not exist on node1

func_colname_with_args

参数说明: 该参数用于控制函数返回结果的列名是否带参数列表,即返回结果的字段名称与查询语句中一致。

该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围: 布尔型

  • on:函数返回结果带参数。
  • off:函数返回结果不带参数。

默认值: off

示例:

1、设置func_colname_with_args参数。

set func_colname_with_args=on;

2、执行函数查询。

select to_char(123) from dual;

返回结果为:

 to_char(123)
------------
 123
(1 row)

oracle_vpd_enabled

参数说明: 该参数用于控制oracle_vpd功能。

该参数属于SIGHUP类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围: 布尔型

  • on:表示打开oracle_vpd功能。

  • off:表示关闭oracle_vpd功能。

默认值: off

enable_plpgsql_global_compile_cache

参数说明: 控制PL/SQL全局缓存功能的开启和关闭。参数为实例级别,修改后重启数据库生效。

该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围:布尔型

  • on表示启用PL/SQL全局缓存功能。

  • off表示关闭PL/SQL全局缓存功能。

默认值: off

plpgsql_compile_cache_max_size

参数说明: 用于设置允许PL/SQL全局缓存的大小。参数为实例级别,修改后重启数据库生效。

该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围:整型,[0,2147483647]。

默认值:100000000

vb_date_type

参数说明: Oracle兼容模式下,date类型的控制参数,用来控制date类型的底层存储类型。

该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围: 布尔型

  • 1:date底层存储为oradate。

  • 2:date底层存储为timestamp。

默认值: 1

示例

示例1: Oracle兼容下设置date类型控制参数。

1、创建数据库,设置兼容模式为Oracle。

CREATE DATABASE date_test_Oracle DBCOMPATIBILITY 'A';

2、配置date类型控制参数vb_date_type。

alter system set vb_date_type = 1;

3、重启数据库。

vb_ctl restart

4、查看date兼容效果。

\c date_test_Oracle
select '2022-08-19'::date;

查询结果显示为:

       oradate
---------------------
 2022-08-19 00:00:00
(1 row)

示例2:Oracle兼容模式下,通过修改postgresql.conf设置date类型控制参数。

1、配置date类型控制参数。

vi $PGDATA/postgresql.conf
//设置参数:
vb_date_type = 2;

2、重启数据库。

vb_ctl restart

3、创建数据库。

CREATE DATABASE date_test_postgresqlconf DBCOMPATIBILITY 'A';
\c date_test_postgresqlconf

4、查看date兼容效果。

select '2022-08-19'::date;

查询结果显示为:

      timestamp
---------------------
 2022-08-19 00:00:00
(1 row)

lob_return_lobloc

参数说明: 该参数用于控制查询lob字段的返回内容。关闭该参数,查询lob字段时直接返回真实数据;开启该参数,则返回lob定位器,需要借助DBMS_LOB.READ来获取真实数据。

  • 开启此参数适用于原始数据特别大,不能通过select语句直接返回的情况。
  • 该参数仅在数据库兼容模式为Oracle时有效(即数据库实例初始化时指定DBCOMPATIBILITY='A')。

该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围: 布尔型

  • on:查询lob字段时返回lob定位器。
  • off:查询lob字段时直接返回真实数据。

默认值: off

enable_oralob_type

参数说明: 用于控制当前实例中 SQL 涉及的 LOB 类型的解析方式。

该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围: 布尔型

  • off:直接存储数据。(默认值)

  • on:使用定位器存储。

  • 此参数仅在数据库兼容模式为Oracle时有效(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
  • 此参数只能在实例初始化完成后,第一次启动前在配置文件中进行修改。
  • 如果使用 vb_initdb 初始化实例时指定了参数--enable-oralob-type,则此参数必须设置为on,否则无需设置或应设为off。

enable_oranumber_type

参数说明: 控制Oracle兼容模式下NUMBER类型的映射逻辑。

该参数仅在V2.2 Build 15(Patch No.3)及以上版本支持。

该参数属于SIGHUP类型参数,请参考重设参数表1中对应设置方法进行设置。

取值范围: 布尔型

  • on:number关键字映射为number类型。

  • off:number关键字映射为numeric类型。

默认值: on