Wer*_*bel 4 oracle plsql stored-procedures
我收到错误:
ORA-03001: unimplemented feature
ORA-06512: at "SYS.CHANGE_SSAN", line 127
ORA-06512: at line 2
Process exited.
Run Code Online (Sandbox Code Playgroud)
在这一行:
alter_constraints_disable(hosm_list.hosm);
Run Code Online (Sandbox Code Playgroud)
这是程序:
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;
Run Code Online (Sandbox Code Playgroud)
该问题似乎来自下一行,而不是对 alter_constraints_disable 的调用。
立即执行“从‘||hosm_list.hosm||’.dod_per order by 1 asc’中选择person_id批量收集到dup_ssan中”;
关于批量收集我有什么遗漏的吗
更好的异常处理将准确地揭示导致错误的原因。运行这个修改后的版本,然后发布输出。
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;
/
Run Code Online (Sandbox Code Playgroud)
更新
不应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;
/
Run Code Online (Sandbox Code Playgroud)