Oracle SQL3 3 嵌套表插入问题
Posted
技术标签:
【中文标题】Oracle SQL3 3 嵌套表插入问题【英文标题】:Oracle SQL3 3 nesting tables insert problem 【发布时间】:2020-04-16 20:07:25 【问题描述】:我正在创建一个 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
);
/
这个是建表脚本
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】:您正在指定一个 T_SET_Message
集合,但您需要其中的 T_Message
对象;您提供的是该对象类型的属性,而不是该类型的实际对象。 (非)集合中的第一个元素是一个字符串,因此您得到的错误是 - 您在期望看到 UDT (T_Message('Paris...', ...)
) 时提供了一个字符串 ('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')
)
)
);
db<>fiddle
【讨论】:
以上是关于Oracle SQL3 3 嵌套表插入问题的主要内容,如果未能解决你的问题,请参考以下文章