存储过程中未实现的功能错误

Posted

技术标签:

【中文标题】存储过程中未实现的功能错误【英文标题】:Unimplemented feature error in stored procedure 【发布时间】:2013-07-16 20:49:23 【问题描述】:

我收到错误消息:

ORA-03001: unimplemented feature
ORA-06512: at "SYS.CHANGE_SSAN", line 127
ORA-06512: at line 2
Process exited.

在这一行:

  alter_constraints_disable(hosm_list.hosm);

这是程序:

PROCEDURE alter_constraints_disable (hosm_cd   IN VARCHAR2)

IS
    BEGIN

    for constraint_list IN (select table_name, constraint_name 
                                   from dba_constraints 
                                   where owner=hosm_cd 
                                   and constraint_name in ('List of constraints removed for space.'))
    LOOP
        execute immediate 'alter table '||hosm_cd||'.'||constraint_list.table_name||' DISABLE constraint '||constraint_list.constraint_name;
    END LOOP;
END;

问题似乎来自下一行,而不是调用 alter_constraints_disable。

立即执行'select person_id bulk collect into dup_ssan from '||hosm_list.hosm||'.dod_per order by 1 asc';

批量收集有什么我遗漏的地方

【问题讨论】:

您不应在 SYS 模式中构建自己的对象。该架构是 Oracle 安装的一部分,弄乱它可能会破坏您的数据库。 它只在用于打乱 PII 并触及数据库中每个模式的服务器上。暂时把它放在那里似乎是有意义的。 【参考方案1】:

更好的异常处理将准确发现导致错误的原因。运行这个修改后的版本,然后发布输出。

CREATE OR REPLACE PROCEDURE alter_constraints_disable (hosm_cd IN VARCHAR2)
IS
    BEGIN

    for constraint_list IN (select table_name, constraint_name 
                                   from dba_constraints 
                                   where owner=hosm_cd 
                                   and constraint_name in ('List of constraints removed for space.'))
    LOOP
        DECLARE
            v_sql varchar2(32767);
        BEGIN
            execute immediate 'alter table '||hosm_cd||'.'||constraint_list.table_name||
                ' DISABLE constraint '||constraint_list.constraint_name;
        EXCEPTION WHEN OTHERS THEN
            dbms_output.put_line('Error with '||constraint_list.table_name||'.'||
                constraint_list.constraint_name);
            v_sql := dbms_metadata.get_ddl('TABLE', constraint_list.table_name, hosm_cd);
            dbms_output.put_line('Table that caused the error:'||chr(10)||v_sql);
            raise;
        END;
    END LOOP;
END;
/

更新

bulk collect into 不应位于动态 SQL 字符串中。这是一个例子:

create table dod_per as select level person_id from dual connect by level <= 100;

declare
    type dup_ssan_type is table of number;
    dup_ssan dup_ssan_type;
    v_owner varchar2(30) := user;
begin
    execute immediate 'select person_id from '||v_owner||'.dod_per order by 1 asc'
    bulk collect into dup_ssan;
end;
/

【讨论】:

试过了,得到了同样的错误。这让我觉得错误可能来自其他地方,只是在这里说出来。 这意味着产生同样的错误,但它也会告诉你哪个表和约束产生了错误。如果您在 SQL*Plus 中执行该过程,则需要运行 set serveroutput on 来查看结果。或者您可能希望将信息写入一些日志记录或临时表中。 我在答案发布在这里之前就发现了这个问题,但你对问题所在是 100% 正确的。感谢您的帮助和您的时间。【参考方案2】:

DBA_CONSTRAINTS 仅适用于具有 DBA 角色的用户。尝试使用 ALL_CONSTRAINTS 或 USER_CONSTRAINTS。还要确保执行该过程的用户具有 ALTER CONSTRAINT 权限。

您使用的是什么版本的 Oracle?如果是速成版,则某些功能将无法启用,因为您需要许可证,但据我所知,禁用/启用约束不是其中之一。

【讨论】:

11g 企业版 这很奇怪。您不应该在 Enterprise Edition 中禁用功能。我还测试了你的程序,它执行得很好。 好的,尝试在 DISABLE 命令后添加 KEEP INDEX。它应该看起来像执行立即'alter table'||hosm_cd||'。'||constraint_list.table_name||'禁用约束“||constraint_list.constraint_name||”保持索引; @tiley31 我认为您将ORA-03001: unimplemented featureORA-00439: feature not enabled 混淆了。 “未实现”的意思是“您尝试做的事情是有道理的,我们只是还没有开始编写代码。”【参考方案3】:

有趣的是,当我的查询有一个带有额外尾随双引号的标识符(类似这样)时,我也通过 ODP.NET 提供程序收到此错误

SELECT "Field1" "Alias1", "Field2" "Alias2"
FROM "SomeSchema"."SomeTable"" -- <- extra quote
WHERE "SomeField" = 'SomeCriteria'

一个简单错字的奇怪错误。

【讨论】:

以上是关于存储过程中未实现的功能错误的主要内容,如果未能解决你的问题,请参考以下文章

mysql 存储过程的实现原理

无法从存储过程显示文本到 textview - Android SQL Server

mysql 使用存储过程实现求1-100之间的偶数之和的功能

vs Dataset DataTable 中未显示外键列

懵懂oracle之存储过程2

mysql内置功能—存储过程