存储过程中未实现的功能错误
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 feature
与ORA-00439: feature not enabled
混淆了。 “未实现”的意思是“您尝试做的事情是有道理的,我们只是还没有开始编写代码。”【参考方案3】:
有趣的是,当我的查询有一个带有额外尾随双引号的标识符(类似这样)时,我也通过 ODP.NET 提供程序收到此错误
SELECT "Field1" "Alias1", "Field2" "Alias2"
FROM "SomeSchema"."SomeTable"" -- <- extra quote
WHERE "SomeField" = 'SomeCriteria'
一个简单错字的奇怪错误。
【讨论】:
以上是关于存储过程中未实现的功能错误的主要内容,如果未能解决你的问题,请参考以下文章
无法从存储过程显示文本到 textview - Android SQL Server