Циклическая зависимость - ошибка вставки таблицы

Я хочу вставить данные в таблицу, но получил ошибку ниже .. Кто-нибудь может мне помочь ..

CREATE OR REPLACE TYPE TEST_TYP FORCE IS OBJECT 
    ("id" VARCHAR(5000 NULL) 
NOT FINAL;

CREATE OR REPLACE TYPE TEST_TAB is table of REF TEST_TYP; 

CREATE OR REPLACE TYPE TEST1_TYP FORCE IS OBJECT 
    ("id" VARCHAR2(500) NULL,
     "extension" "TEST_TAB" NULL )
NOT FINAL;


CREATE TABLE "TEST_OBJ_TABLE" OF "TEST1_TYP"
NESTED TABLE "extension" STORE AS "Allin"

Когда я пытаюсь вставить с помощью этого оператора L

insert into "TEST_OBJ_TABLE" ("id","extension")
VALUES(
'0FE71A85',
"TEST_TAB"("TEST_TYP"( '0FE71A8'))
);

Выдает эту ошибку

Ошибка в командной строке: 59 Столбец: 12
Отчет об ошибке -
Ошибка SQL: ORA-00932: несогласованные типы данных: ожидается REF SUB_HWOW.TEST_TYP получил SUB_HWOW.TEST_TYP
00932. 00000 - «Несогласованные типы данных: ожидаемые% s получил% s "
* Причина:
* Действие:


person prasad nagireddi np    schedule 17.09.2018    source источник
comment
Почему это круговая зависимость? Ошибка говорит о том, что проблема в том, что вы вставляете объект, а не ссылку на объект. Итак, вам нужно решить, должна ли первая таблица действительно быть refs, и если да, то где будут жить фактические ссылочные объекты?   -  person Alex Poole    schedule 17.09.2018
comment
Спасибо, Алекс .. Чтобы вставить данные в эту таблицу, что я должен сделать ... Можете ли вы исправить мой код ..   -  person prasad nagireddi np    schedule 17.09.2018


Ответы (2)


  1. Вы должны изменить объект TEST_TYP -> varchar2 has to be max 4000. Вы должны сохранить этот объект в db.
  2. Создать таблицу объектов для TEST_TYP create table t_for_test_type of TEST_TYP;
  3. Чтобы получить ссылку на объект, его необходимо сохранить в таблице db. В твоем случае:

    объявить
    v_ref_to_test_type1 ref TEST_TYP;
    начать вставку в t_for_test_type значения t ('abcd1') вернуть ref (t) в v_ref_to_test_type1;
    конец:

  4. Соедините все части вместе.

    объявить v_ref_to_test_type1 ref TEST_TYP;
    v_ref_to_test_type2 ref TEST_TYP;
    начать вставку в значения t_for_test_type ('abcd1') вернуть ref (t) в v_ref_to_test_type1; вставить в t_for_test_type значения t ('abcd2') вернуть ref (t) в v_ref_to_test_type2; вставить в значения TEST_OBJ_TABLE (TEST1_TYP ('abcd', новый TEST_TAB (v_ref_to_test_type1, v_ref_to_test_type2))); конец;

  5. Таблица запросов. select t."id",x.column_value from TEST_OBJ_TABLE t, table(t."extension") x возвращает id + ref другому объекту

  6. Просмотр указанного объекта. select t."id",deref(x.column_value) from TEST_OBJ_TABLE t, table(t."extension") x

Примечание 1. Вам следует избегать объявления атрибута с использованием двойных кавычек. Db становится чувствительным к регистру, и это ненормальная ситуация :)

Заметка 2. Я не знаю, почему форматирование кода сегодня не работает

Вопрос. Почему вы пытаетесь использовать такую ​​сложную конструкцию?

person Arkadiusz Łukasiewicz    schedule 18.09.2018

Изменил исходный ответ. Цитаты не делали вам одолжений - и не называли ваши имена столбцов идентификатором. Ссылка на REF удалена.

CREATE OR REPLACE TYPE TEST_TYP FORCE IS OBJECT 
    (id1 VARCHAR(4000) NULL)
NOT FINAL;

CREATE OR REPLACE TYPE TEST_TAB is table of TEST_TYP; 

CREATE OR REPLACE TYPE TEST1_TYP FORCE IS OBJECT 
    (id2 VARCHAR2(500) NULL,
     extension TEST_TAB NULL )
NOT FINAL;


CREATE TABLE TEST_OBJ_TABLE OF TEST1_TYP
NESTED TABLE extension STORE AS Allin ;

insert into TEST_OBJ_TABLE ( ID2, EXTENSION)
VALUES(
'0FE71A85',
TEST_TAB(TEST_TYP( '0FE71A8'))
);

SELECT * FROM TEST_OBJ_TABLE ;
person Brian Rodgers    schedule 17.09.2018
comment
Спасибо, Брайан ... В предыдущем вопросе я забыл включить объявление TEST_TYP. Теперь я изменил это. Можете ли вы мне сейчас помочь. Пока я пытаюсь вставить данные в таблицу, которую я создал, это дало ошибку, например, ожидаемую REF SUB_HWOW.TEST_TYP получил SUB_HWOW.TEST_TYP, но я я не знаю, как это решить. - person prasad nagireddi np; 17.09.2018