【问题标题】:Select query error in OracleOracle中的选择查询错误
【发布时间】:2012-04-15 17:10:57
【问题描述】:

我首先创建了一个类型,然后创建了一个表,然后将 1 行插入到表中,这很成功,但是当我在表上触发 Select 查询时出现错误:

create type My_type as Object
(
fname varchar2(10),
lname varchar2(10)
); 

现在创建表

create table My_table 
(
name My_type,
phone number
);

插入一行

insert into My_table values ( My_type('Abc','Xyz'), 122);

触发 Select 查询

select * from My_table;

错误:ORA-00932:不一致的数据类型:预期的 NUMBER 得到了 OODB.MY_TYPE

select name.fname, name.lname, phone from My_table;

错误:ORA-00904:“NAME”。“LNAME”:标识符无效

select My_type.fname, My_type.lname, phone from My_table;

错误:ORA-00904:“MY_TYPE”。“LNAME”:标识符无效

【问题讨论】:

  • 您使用什么客户端来执行这些查询?
  • 我在家里的 Windows XP PC 上使用 Oracle 10g Express Edition

标签: sql oracle plsql types oracle10g


【解决方案1】:

如果您使用当前版本的 SQL*Plus,这应该可以工作

SQL> create type My_type as Object ( fname varchar2(10), lname varchar2(10) );
  2  /

Type created.

SQL> create table My_table ( name My_type, phone number );

Table created.

SQL> insert into My_table values ( My_type('Abc','Xyz'), 122);

1 row created.

SQL> column name format a30;
SQL> select * from My_table;

NAME(FNAME, LNAME)                  PHONE
------------------------------ ----------
MY_TYPE('Abc', 'Xyz')                 122

如果您使用的是非常旧的 SQL*Plus 版本,或者您使用的是其他客户端工具,而客户端工具不知道如何处理对象类型,则可能是这样。

在课堂练习之外,您通常不会定义具有现实世界中对象类型的表格。在 PL/SQL 代码中使用对象类型来简化处理更为常见——另一方面,处理作为数据模型的一部分存储的对象往往会出现问题。

【讨论】:

  • 什么是“列名格式a30”;我输入了这个,但它说“无效的 SQL 语句”
  • @R122 - 这是 SQLPlus 命令,而不是 SQL 语句。它只是告诉 SQLPlus 使用 30 个字符显示 NAME 列中的数据。如果省略它,SQLPlus 中的输出可能会换行到下一行。但听起来你没有使用 SQLPlus。
  • 好人!对于“列名格式a30;”但是这次我使用了 sqlplus 并且选择查询成功但是当我使用数据库主页(即对象浏览器和所有)尝试它时,它给出了我的问题中提到的上述错误......那么为什么相同的查询在 sqlplus 中执行,而不是使用 Oracle 数据库主页?
  • 但在“列名格式 a30”中,“a”是什么?我尝试用字母“b”代替它,它给了我错误?
  • @R122 - a30 中的 a 仅表示该列应显示为字符串(我假设 a 代表字母)。我没有做任何测试的猜测是Oracle数据库主页中的查询工具不支持显示用户定义的对象类型(这可以追溯到作为数据模型的一部分定义的对象类型在家庭作业之外非常罕见问题——很多工具都不会费心去实现对它们的支持)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2016-05-03
  • 1970-01-01
  • 2019-12-09
  • 2010-10-07
  • 1970-01-01
  • 2014-08-26
相关资源
最近更新 更多