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

Posted

技术标签:

【中文标题】在 Oracle 12 中强制执行函数名称长度以满足 SQL-92 标准【英文标题】:enforcing functions name length in Oracle 12 to meet SQL-92 standard 【发布时间】:2021-01-16 06:36:39 【问题描述】:

在 Oracle 12 中有没有办法强制函数名(和常量名)的最大长度仅为 30 个字符? (如在 oracle 11g 和之前的版本中)

【问题讨论】:

其实SQL-92标准定义了标识符的上限为128个字符。 @a_horse_with_no_name 谢谢你,问题更新了,我们需要像在 oracle 11g 中一样强制最大长度为 30 个字符 【参考方案1】:

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

将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

您需要在多大程度上限制函数中的名称?我可以想到一种将函数的​​ all 标识符限制为 30 个字节的有点困难的方法,但将 constant 标识符限制为 30 个字节则更加困难。

【讨论】:

以上是关于在 Oracle 12 中强制执行函数名称长度以满足 SQL-92 标准的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 where 子句中的函数在 oracle 中执行一次?

如何强制优化器重用 sql 游标

oracle decimal(10,0)类型强制转换sql char(10) 如何转换

Oracle汉字用户名数据脱敏长度不变,rpad函数使用

oracle学习3

如何在变量声明 (CS0270) 中强制执行数组的长度?