【问题标题】:Inconsistent datatypes: expected REF got .. error when trying to insert data不一致的数据类型:预期的 REF 尝试插入数据时出现 .. 错误
【发布时间】:2015-05-02 20:35:30
【问题描述】:

长话短说,我想做的是将一些数据插入表中,但我在理解问题所在时遇到了一些问题。我会让代码自己说话。希望你能帮助我。提前致谢!

CREATE OR REPLACE TYPE Departament IS OBJECT (
  deptno NUMBER(2),
  dname CHAR(14)
  );
/

CREATE OR REPLACE TYPE Employee IS OBJECT (
  empno NUMBER(4),
  ename CHAR(10),
  dept REF Departament,
  sal NUMBER(7,2)
  ) NOT FINAL;
/

CREATE OR REPLACE TYPE Manager UNDER Employee (
  nrEmp NUMBER(2)
  );
/

CREATE TABLE departament_list AS (SELECT deptno, dname FROM dept);
/

CREATE TABLE manager_list OF Manager;
/

INSERT INTO manager_list VALUES(Manager(7782, 'JOHN', Departament(20, 'TEXAS'), 6000, 2));

这是最后一行的问题,我收到以下错误

ORA-00932:不一致的数据类型:得到预期的 REF SYS.DEPARTAMENT 系统部门。

现在不要误会我的意思,我已尝试使用以下方法进行整个选择:REF(d) from department_list d ...但我收到另一个错误,提示默认构造函数的参数数量不正确。

也许我做错了,你可以帮助阐明我错在哪里。再次感谢!

【问题讨论】:

  • 你能显示你使用 REf(d) 的版本以及它的确切错误吗?
  • 这行不应该是:'CREATE TABLE 部门列表 AS (SELECT deptno, dname FROM dept);'是 'CREATE TABLE department_list AS (SELECT deptno, dname FROM Department');
  • @Typo - 从列名来看,它看起来像是基于旧的 scott emp/dept 架构,而不是具有部门的 hr 架构?不过,不要认为这与问题有关。
  • @AlexPoole 我认为这是基于他在上面创建的类型 Department
  • 这将有助于了解异常发生在哪一行代码

标签: sql oracle plsql


【解决方案1】:

这似乎是错误原因:

CREATE TABLE departament_list AS (SELECT deptno, dname FROM dept);

对我有用的步骤:

CREATE TABLE departament_list of Departament;

insert into departament_list values (20, 'Texas');

CREATE TABLE manager_list OF Manager;

INSERT INTO manager_list VALUES(Manager(7782, 'JOHN', 
  (select ref(d) from departament_list d where deptno=20), 6000, 2));

来自documentation

OF 子句允许你显式地创建一个对象表类型 对象类型。对象表的列对应于 object_type 类型的顶级属性。每行将包含一个 对象实例,并且每个实例都将被分配一个唯一的, 插入行时系统生成的对象标识符。

【讨论】:

  • 非常感谢您的帮助!
【解决方案2】:

数据类型不一致,修改Employee对象定义如下:

CREATE OR REPLACE TYPE Employee IS OBJECT (
  empno NUMBER(4),
  ename CHAR(10),
  dept  Departament,
  sal NUMBER(7,2)
  ) NOT FINAL;
/

然后运行插入语句:

SQL> INSERT INTO manager_list VALUES(Manager(7782, 'JOHN', Departament(20, 'TEXAS'), 6000, 2));

1 row created.

SQL>

注意:要更新员工对象,您需要删除“manager_list”(表)和“经理”(类型),然后更新员工对象定义,然后再次创建“manager_list”和“manager”。

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 2016-08-18
    • 2016-04-30
    • 2013-04-19
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多