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

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中”;

关于批量收集我有什么遗漏的吗

Jon*_*ler 5

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

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)