分享
 
 
 

案例学习Oracle错误:ORA-00904

王朝oracle·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

ORA-00904 invalid column name

ORA-00904: 无效的列名

Cause The column name entered is either missing or invalid.

Action Enter a valid column name. A valid column name must begin with a letter, be less than or equal to 30 characters, and consist of only alphanumeric characters and the special characters $, _, and #. If it contains other characters, it must be enclosed in double quotation marks. It may not be a reserved Word.

原因:列丢失或无效列名。

方案:输入有效的列名。一个有效的列名必须是以字母开头,小于30个字符,并且只包含字母、数字或一些非凡的符号$,_,#。假如还包含其它的字符,那么这段字符必须用双引号引起来。列名不能是要害字。

案例一:创建表时出现的问题

问题描述:

SQL> DESC S_CUSTOMER;

名称 是否为空? 类型

-----------------------------------------

id NOT NULL NUMBER(7)

name NOT NULL VARCHAR2(50)

phone VARCHAR2(25)

address VARCHAR2(400)

city VARCHAR2(30)

state VARCHAR2(20)

country VARCHAR2(30)

zip_code VARCHAR2(75)

credit_rating VARCHAR2(9)

sales_rep_id NUMBER(7)

region_id NUMBER(7)

comments VARCHAR2(255)

但是当我SELECT的时候总是报错:

SQL> SELECT ID FROM S_CUSTOMER;

SELECT ID FROM S_CUSTOMER

*

ERROR 位于第 1 行:

ORA-00904: "ID": 无效的标识符

怎么会这样呢?

解决方案:Oracle通过访问SQL Server的数据库链接时,用select * 的时候字段名是用双引号引起来的。你创建表的语句加了双引号的吗?估计是PD类似的工具创建的脚本吧?

看下面的例子

SQL> create table test ("id" number not null);

表已创建。

SQL> select ID FROM test;

select ID FROM test

*

ERROR 位于第 1 行:

ORA-00904: "ID": 无效的标识符

SQL> select id from test;

select id from test

*

ERROR 位于第 1 行:

ORA-00904: "ID": 无效的标识符

SQL> desc test;

名称 是否为空? 类型

----------------------------------------- -------- ------------

id NOT NULL NUMBER

SQL> select "id" from test;

未选定行

SQL>

案例二:

环境:solaris+oracle

问题:eXP时碰到

EXP-00008: ORACLE error 904 encountered

ORA-00904: invalid column name

EXP-00000: Export terminated unsUCcessfully

提供的情况:wcs组使用Java,所以判定是java的问题。ora-00904时oracle的一个bug。

所以需要使用errorstack来追踪错误。执行

alter system set events='904 trace name errorstack';

然后到udump下查看trace文件。发现是exu8jbqu这个view的问题。

alter system set events='904 trace name errorstack off';

查看exu8jbqu是否存在:

select owner,object_name,object_type,object_id,status

from dba_objects where object_name='exu8jbqu';

发现存在。重新执行$ORACLE_HOME/rdbms/admin/catexp.sql 创建视图。

重新执行exp成功。问题解决。 案例三:

环境 unix+oracle

在做完全导出的时候,导出表都正常但到导出同义词时出错,错误如下:

exporting synonyms

exp-0000 racle error 904 encountered

ora-00904 invalid column name

exp-0000 exp terminaled unsuccessful

使用任何一个用户导出该的数据同样在这个地方停住,请问这是由于什么情况造成的,该如何解决才能正常exp整个数据库呢?之前碰上过类似的情况: 数据库被改了字符集后,导出时也是到synonym的时候出错误,报"shortname" 错误,后来把字符集改回原来安装的时候选择的字符集即可。 使这个问题吗?

解决方案:原因不是字符集的问题,而是同义词引起的,找出来将其删除就可以了。

案例四:Oracle环境中访问所有的SQL Server字段出错

问题描述:我刚刚从Oracle建立了一条到SQL Server的连接,使用的是普通的连接,我想要执行一条select * from tablename@dblink 的命令。然而,我注重到SQL Server表中所有的字段都无法在Oracle环境中访问。当我试图选择我认为应该在表中的字段的时候,我得到ORA-00904的错误信息:无效列名。针对这个问题的可能的解释和解决方案是什么?

解决方案:当你在你的语句中指定了列名的时候,确保你用双引号括住了列名,并且名字是区分大小写的。例如:SELECT "column_A","Column_B" FROM "TableXYz"。

Oracle倾向于将上述字母转换为大写字母,SQL Server则对大小写更加敏感。这就是最有可能的原因。

案例五:不访问系统表获取无效列名

问题描述:当我从我的应用程序中运行SQL语句的时候,我得到如下的错误信息:“ORA-00904”无效列名。我的问题是,在不访问系统表的时候,有没有一种方式可以获得有关这个错误的更多信息,例如那些无效的列名?

解决方案:当你获得这个消息的时候运行了什么查询?你的答案就在这里。运行的查询中的一个列是无效的。假如你能运行这个查询,那么你就可以看到包括了查询中表的信息的“系统表”。只需要开启SQL*Plus 会话,并且对表(或者一些表)进行描述。你的查询中的一个列就不会是其中一个表的有效列名了。

假如你不知道SQL语句是什么,那么你就要运行的时候进行追踪,找出错误中的语句。假如你不熟悉,不知道该怎么做的话,需要请求数据库治理员的帮助。

案例六:查看拥有抽象字段数据类型的表中记录出错

问题描述:我想要查看一个表中记录,这个表中有一个字段具有抽象的数据类型,我创建了如下的类型:

create or replace type marks_ty as object

(m1 number(3),

m2 number(3),

m3 number(3),

member function totmarks(m1 in number,m2 in

number,m3 in number)

return number);

/

然后我创建了如下的类型体:

create or replace type body marks_ty as

member function totmarks(m1 number,m2 number,m3

number)

return number is

begin

return (m1+m2+m3);

end;

end;

/

其次,创建了如下的表:

create table stdmarks

( student_id number(4),

marks marks_ty);

然后,我向其中插入了一些记录。之后,我执行了如下的语句:

select marks.totmarks(marks.m1,marks.m2,marks.m3)

from stdmarks;

但是我却碰到了如下的错误信息:

select marks.totmarks(marks.m1,marks.m2,marks.m3)

from stdmarks

*

ERROR at line 1:

ORA-00904: invalid column name

请帮助我。我在Oracle企业版中都试过了。

解决方案:一个有关你进行的操作的很少被人了解的事实就是你需要给表名起个别名,并且在调用成员函数的时候使用别名。那么,对你的查询进行如下修改:

SELECT s.marks.totmarks(marks.m1,marks.m2,marks.m3)

FROM stdmarks s;

案例七:探究ORA-00904错误信息

问题描述:我注重到您对ORA-00904错误信息的解答,这个ORA-00904错误信息是在链接SQL 服务器数据库表之后,试图对不同类型的列进行选择时出现的。您的答案说,每个列都需要用双引号来包围。这样做好吗?我们有一个应用程序,但是我们并不希望有这样的限制。这里面有什么考虑吗?

解决方案:你可以试试看,改变你的SQL服务器实例的校验,使它不为默认情况下的大小写敏感。此时,表名“MyTable”和“MYTABLE”指的是同一个表。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有