Насколько я могу судить, ничего из того, что вы опубликовали, вызывает эту ошибку.
Дополнительным недостатком является способ выбора ограничений внешнего ключа.Если вы не называете его, Oracle назначит само имя, и оно будет выглядеть так, как вы его опубликовали: SYSTEM.SYS_C007167
.
SQL> create table test
2 (id_dept number,
3 id_emp number,
4 foreign key (id_dept) references dept (deptno),
5 foreign key (id_emp) references emp (empno));
Table created.
SQL> select constraint_name from user_constraints where table_name = 'TEST';
CONSTRAINT_NAME
------------------------------
SYS_C008172
SYS_C008173
SQL>
Когда один из них не работает, глядя на его имя, вы понятия не имеете , что пошло не так, если вы не исследуете немного больше:
SQL> select column_name from user_cons_columns where constraint_name = 'SYS_C008173';
COLUMN_NAME
-----------------------
ID_EMP
SQL>
Но, если вы назовете ограничение, оно будет намного проще:
SQL> create table test
2 (id_dept number,
3 id_emp number,
4 constraint fk_test_dept foreign key (id_dept) references dept (deptno),
5 constraint fk_test_emp foreign key (id_emp) references emp (empno));
Table created.
SQL> select constraint_name from user_constraints where table_name = 'TEST';
CONSTRAINT_NAME
------------------------------
FK_TEST_DEPT
FK_TEST_EMP
SQL>
Еще один главный недостаток, который замечает то, что написано перед точкой, здесь: SYSTEM.SYS_C007167
.Да, это было бы SYSTEM
.Короче, не делай этого.Оставьте SYS и SYSTEM в покое;они мощные, они особенные.Почему вы рискуете уничтожить базу данных, если вы (не) намеренно делаете что-то опасное?Создайте другого пользователя, предоставьте необходимые привилегии и работайте в этой схеме.
Если я правильно вас понял, когда вы создадите эту таблицу temp (TEMP_TAB7364
), ее содержимое будет перенесено в DW_ITEMS7364
и - при этом - вы нажали ошибку.
Если это так, какова цель таблицы temp ?Вставьте прямо в целевую таблицу и сохраните ресурсы.Это потерпит неудачу?Конечно, будет, если вы не измените запрос.Как?Я не знаю - убедитесь, что вы не вставляете значения, которые не существуют ни в одной из трех таблиц, используемых для обеспечения ссылочной целостности.
Хотя, поскольку у вас уже есть temp Таблица, если она не слишком большая, можно найти (относительно) быстрый и грязный способ выяснить, какая строка ответственна за ошибку, с помощью цикла, такого как
begin
for cur_r in (select col1, col2, ... from temp_table) loop
begin
insert into target (col1, col2, ...)
values (cur_r.col1, cur_r.col2, ...);
exception
when others then
dbms_output.put_line(sqlerrm ||': '|| cur_r.col1 ||', '||cur_r.col2);
end;
end loop;
end;
Внутренний *Блок 1038 * здесь, чтобы убедиться, что код PL / SQL не выйдет при первой ошибке, но отобразит их все.Затем просмотрите эти значения и найдите причину, которая делает ваш запрос недействительным.