You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

插入时遇ORA-00932数据类型不一致错误求助

解决ORA-00932: inconsistent datatypes错误

这个错误的根源很明确:当你在customers表中定义REF address_type列时,Oracle需要知道这个引用指向哪个具体的对象表——你已经创建了addresses表来存储address_type对象,但没告诉Oracle这个REF和addresses表关联,所以它无法识别正确的REF类型(期望的是关联到addresses表的REF ADDRESS_TYPE,而你只写了ADDRESS_TYPE相关的定义)。

修复方案

你需要在定义REF列时,通过SCOPE IS或者REFERENCES关键字指定关联的对象表addresses,两种方式的区别如下:

方式1:使用SCOPE IS(限制REF只能指向指定表的对象)

CREATE TABLE customers (
    customer_id NUMBER(6),
    title VARCHAR2(5),
    firstname VARCHAR2(20),
    surname VARCHAR2(20),
    telephone VARCHAR2(12), -- VARCHAR2用于支持客户使用+44格式
    address REF address_type SCOPE IS addresses
);

方式2:使用REFERENCES(额外添加外键约束,确保引用的对象存在)

CREATE TABLE customers (
    customer_id NUMBER(6),
    title VARCHAR2(5),
    firstname VARCHAR2(20),
    surname VARCHAR2(20),
    telephone VARCHAR2(12),
    address REF address_type REFERENCES addresses
);

REFERENCES会创建外键约束,当你尝试删除addresses中被客户引用的地址时,Oracle会阻止删除(默认行为),而SCOPE IS只是限制REF的指向范围,没有约束检查。

插入数据示例

修复表结构后,你可以这样插入关联数据:

-- 先插入地址对象到addresses表
INSERT INTO addresses VALUES (address_type('22B Baker St', 'Marylebone', 'London', 'NW1 6XE'));

-- 插入客户时,通过REF引用已有的地址
INSERT INTO customers
VALUES (
    1001,
    'Mr',
    'Sherlock',
    'Holmes',
    '+442072243688',
    (SELECT REF(a) FROM addresses a WHERE a.house_name = '22B Baker St')
);

内容的提问来源于stack exchange,提问作者Dev

火山引擎 最新活动