在Oracle12中强制执行函数名称长度以满足SQL-92标准



在Oracle12中,是否有一种方法可以强制函数名(和常量名(的最大长度仅为30个字符?(如oracle 11g和先验(

Oracle函数名长度可以通过COMPATIBLE参数或事件触发器进行限制。

将COMPATIBLE参数设置为低于12.2.0.0.0的值将防止任何标识符超过30个字节。然而,这是一个强大的参数,会影响很多功能,并且无法轻易更改。

一种更简单但不那么全面的方法是创建一个事件触发器,该触发器可以阻止任何创建具有长对象名的对象的DDL。例如,下面的触发器阻止一个模式创建任何具有长名称的函数。

create or replace trigger enforce_name_length
--Change "schema" to "database" to protect entire database.
--But be careful and test thoroughly before you block DDL on an entire database.
before create on schema
begin
if ora_dict_obj_type = 'FUNCTION' and lengthb(ora_dict_obj_name) >= 31 then
raise_application_error(-20000, 'Cannot create ' || ora_dict_obj_owner || '."' 
|| ora_dict_obj_name || '", the object name is longer than 30 bytes.');
end if;
end;
/

尝试创建这样的函数:

create or replace function large_function_name012345789012 return number is begin return 1; end;
/

将生成此错误:

ORA-04088: error during execution of trigger 'JHELLER.ENFORCE_NAME_LENGTH'
ORA-00604: error occurred at recursive SQL level 1
ORA-20000: Cannot create JHELLER."LARGE_FUNCTION_NAME012345789012", the object name is longer than 30 bytes.
ORA-06512: at line 3

在一个函数中,您需要对名称进行多大程度的限制?我可以想出一种有点困难的方法来将函数的所有标识符限制为30字节,但仅将常量标识限制为30个字节会更困难。

最新更新