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 TABLE
、ALTER 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