Круговая зависимость - ошибка вставки таблицы - PullRequest
0 голосов
/ 17 сентября 2018

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

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"
* Причина:
* Действие:

Ответы [ 2 ]

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

    объявляет
    v_ref_to_test_type1 ref TEST_TYP;
    начинает вставку в t_for_test_type t значений ('abcd1'), возвращает ref (t) в v_ref_to_test_type1;
    end:

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

    объявляйте v_ref_to_test_type1 ref TEST_TYP;
    v_ref_to_test_type2 ref TEST_TYP;
    начинайте вставку в t_for_test_type t значений ('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)));end;

  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.Я не знаю, почему форматирование кода не работает сегодня

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

0 голосов
/ 17 сентября 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 ;
...