Oracle Проблема вставки вложенных таблиц SQL3 3 - PullRequest
2 голосов
/ 16 апреля 2020

Я делаю сценарий SQL3, в котором я создаю типы, а затем создаю таблицы и вложенные таблицы. Получаемая проблема возникает, когда я хочу вставить строку, в которой говорится:

ORA-00932: несовместимые типы данных: ожидаемый UDT получил CHAR

это Воспроизведение проблемы, когда типы и таблицы уже созданы, можно попытаться вставить: https://www.tutorialspoint.com/oracle_terminal_online.php?fbclid=IwAR0GgaLe2_GvGsEb80eB-D0uKDSDJDr1WNBPiK3mHQqpJQrtfacQ1cf03NA

Ниже приведен сценарий создания типов

CREATE TYPE T_Personne ;
/

CREATE TYPE T_SET_Tag AS TABLE OF Varchar2(30);
/

CREATE TYPE T_Message AS OBJECT (
    Texte Varchar2(500),
    DateEcrit Date,
    Tags T_SET_Tag
);
/

CREATE TYPE T_SET_Message AS TABLE OF T_Message;
/

CREATE TYPE T_Contact AS OBJECT(
    Per REF T_Personne,
    Depuis Date
);
/

CREATE TYPE T_SET_Contact AS TABLE OF T_Contact;
/

CREATE OR REPLACE TYPE T_Personne AS OBJECT (
    Prenom Varchar2(30),
    Suit T_SET_Contact,
    Ecrit T_SET_Message
);
/
* 1014. * это скрипт создания таблицы
CREATE TABLE TAB_Personne OF T_Personne
    NESTED TABLE Suit STORE AS TAB_suit,
    NESTED TABLE Ecrit STORE AS TAB_ecrit(
        NESTED TABLE Tags STORE AS TAB_Tags
    );

и, наконец, скрипт, который я использую для вставки моих новых строк

INSERT INTO TAB_Personne VALUES( 
    'Baam',
    T_SET_Contact(),
    T_SET_Message()
);

INSERT INTO TAB_Personne VALUES( 
    'Rachel',
    T_SET_Contact(
        (SELECT REF(P)
        FROM TAB_Personne P
        WHERE P.Prenom='Baam'), 
        to_date('01/01/2018', 'dd/mm/yyyy')
    ),
    T_SET_Message(
        'Paris candidat aux jeux Olympiques 2022',
        to_date('01/06/2019', 'dd/mm/yyyy'),
        T_SET_Tag('JM2022')
    )
);

полученное сообщение об ошибке

1 строка создана.

  'Paris candidat aux jeux Olympiques 2022',      *

ОШИБКА в строке 10:

ORA-00932: несовместимые типы данных: ожидаемый UDT получил CHAR

Я был бы рад, если кто-нибудь может мне помочь, спасибо.

1 Ответ

2 голосов
/ 17 апреля 2020

Вы указываете коллекцию T_SET_Message, но затем вам нужно T_Message объектов в ней; вы предоставляете атрибуты этого типа объекта, а не фактический объект этого типа. Первый элемент (не) коллекции - это строка, поэтому вы получаете ошибку - вы указали строку ('Paris...'), когда она ожидает увидеть UDT (T_Message('Paris...', ...)).

Вы также делаете то же самое с коллекцией T_SET_Contact.

Вам необходимо обернуть текущие атрибуты в конструкторы объектов; так что это работает:

INSERT INTO TAB_Personne VALUES( 
    'Rachel',
    T_SET_Contact(
        T_Contact(
            (SELECT REF(P)
            FROM TAB_Personne P
            WHERE P.Prenom='Baam'), 
            to_date('01/01/2018', 'dd/mm/yyyy')
        )
    ),
    T_SET_Message(
        T_Message(
            'Paris candidat aux jeux Olympiques 2022',
            to_date('01/06/2019', 'dd/mm/yyyy'),
            T_SET_Tag('JM2022')
        )
    )
);

дБ <> скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...