函数索引 ORA-30553: The function is not deterministic 解决方法

本文介绍了解决在Oracle数据库中创建函数索引时遇到的ORA-30553错误的方法。该错误提示函数不是确定性的。通过在自定义函数定义中加入DETERMINISTIC属性可以避免此问题。

建函数索引的时候报错:ORA-30553: The function is not deterministic 这个函数是自定义的。

SQL>create index mobileIndex on mobile(getmobilearea (callerno));

Google 一下:

ORA-30553:

The function is not deterministic

Cause:

The function on which the index is defined is not deterministic

Action:

If the function is deterministic, mark it DETERMINISTIC. 

If it is not deterministic (it depends on package state, database state, current time, or anything other than 

the function inputs) then do not create the index. The values returned by a deterministic function 

should not change even when the function is rewritten or recompiled.

 

解决如下:

创建基于自定义函数, 指定deterministic参数,在创建函数索引,就没有问题了

CREATE OR REPLACE FUNCTION ICD.getmobilearea (mobileno VARCHAR2)

   RETURN VARCHAR2 deterministic

IS

   s   VARCHAR2 (20);

   i   INTEGER;

   c   INTEGER;

BEGIN

   FOR i IN 4 .. 11

   LOOP

      SELECT COUNT (*)

        INTO c

        FROM mobilearea

       WHERE shortno LIKE SUBSTR (mobileno, 1, i) || '%';

      s := '000';

      IF c = 0

      THEN

         EXIT;

      ELSE

         IF c = 1

         THEN

            SELECT areacode

              INTO s

              FROM mobilearea

             WHERE shortno LIKE SUBSTR (mobileno, 1, i) || '%';

            EXIT;

         END IF;

      END IF;

   END LOOP;

   RETURN s;

END getmobilearea;

/

### ORA - 15032: not all alterations performed 此错误表明并非所有的更改操作都已执行。在引用[1]中,执行 `alter diskgroup archdg online disks in failgroup fg1` 语句时出现了该错误,同时伴随其他如 `ORA - 15130`、`ORA - 15335` 等错误,可能是磁盘组存在元数据损坏等问题。解决此问题可按以下步骤: 1. 检查磁盘组的状态,确保没有正在进行的操作,如卸载磁盘组等。 2. 检查磁盘组的元数据是否损坏,若存在损坏,可能需要进行修复操作。 3. 确认 `COMPATIBLE.ASM` 属性设置为 11.1 或者更高,因为某些特性依赖此设置。 ```sql -- 查看 COMPATIBLE.ASM 属性 SELECT name, value FROM v$asm_attribute WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'ARCHDG'); -- 修改 COMPATIBLE.ASM 属性 ALTER DISKGROUP archdg SET ATTRIBUTE 'compatible.asm' = '11.1'; ``` ### ORA - 15242: could not set attribute compatible.rdbms 根据引用[2],`compatible.asm` 和 `compatible.rdbms` 是 ASM 磁盘组的兼容性属性,`compatible.rdbms` 处理数据库实例(磁盘组的使用者)的兼容性。此错误表示无法设置 `compatible.rdbms` 属性,可能是当前设置不满足操作要求。解决方法如下: 1. 确认当前 `compatible.rdbms` 属性值,确保其符合操作要求。 2. 若要设置 `compatible.rdbms` 属性,需保证数据库实例的版本支持该值。 ```sql -- 查看当前 compatible.rdbms 属性值 ASMCMD [+DATA/rac] > lsattr -G DATA -l | grep compatible.rdbms -- 修改 compatible.rdbms 属性 ALTER DISKGROUP data SET ATTRIBUTE 'compatible.rdbms' = '11.2.0.0.0'; ``` ### ORA - 15137: The ASM cluster is in rolling patch state 该错误提示 ASM 集群处于滚动补丁状态,在此状态下某些操作可能会受到限制。解决此问题可按以下步骤: 1. 等待滚动补丁操作完成,确保 ASM 集群恢复正常状态。 2. 检查滚动补丁操作的日志,确认是否存在异常情况。 3. 若滚动补丁操作失败,可能需要手动清理相关状态或重新执行补丁操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值