| | |
ORA-00904 invalid column name
ORA-00904: 無(wú)效的列名
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.
原因:列丟失或無(wú)效列名。
方案:輸入有效的列名。一個(gè)有效的列名必須是以字母開(kāi)頭,小于30個(gè)字符,并且只包含字母、數字或一些特殊的符號$,_,#。如果還包含其它的字符,那么這段字符必須用雙引號引起來(lái)。列名不能是關(guān)鍵字。
案例一:創(chuàng )建表時(shí)出現的問(wèn)題
問(wèn)題描述:
SQL> DESC S_CUSTOMER;
名稱(chēng) 是否為空? 類(lèi)型
-----------------------------------------
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的時(shí)候總是報錯:
SQL> SELECT ID FROM S_CUSTOMER;
SELECT ID FROM S_CUSTOMER
*
ERROR 位于第 1 行:
ORA-00904: "ID": 無(wú)效的標識符
怎么會(huì )這樣呢?
解決方案:ORACLE通過(guò)訪(fǎng)問(wèn)SQL Server的數據庫鏈接時(shí),用select * 的時(shí)候字段名是用雙引號引起來(lái)的。你創(chuàng )建表的語(yǔ)句加了雙引號的嗎?估計是PD類(lèi)似的工具創(chuàng )建的腳本吧?
看下面的例子
SQL> create table test ("id" number not null);
表已創(chuàng )建。
SQL> select ID FROM test;
select ID FROM test
*
ERROR 位于第 1 行:
ORA-00904: "ID": 無(wú)效的標識符
SQL> select id from test;
select id from test
*
ERROR 位于第 1 行:
ORA-00904: "ID": 無(wú)效的標識符
SQL> desc test;
名稱(chēng) 是否為空? 類(lèi)型
----------------------------------------- -------- ------------
id NOT NULL NUMBER
SQL> select "id" from test;
未選定行
SQL>
案例二:
環(huán)境:solaris+oracle
問(wèn)題:exp時(shí)遇到
EXP-00008: ORACLE error 904 encountered
ORA-00904: invalid column name
EXP-00000: Export terminated unsuccessfully
提供的情況:wcs組使用java,所以判斷是java的問(wèn)題。ora-00904時(shí)oracle的一個(gè)bug。
所以需要使用errorstack來(lái)追蹤錯誤。執行
alter system set events=‘904 trace name errorstack‘;
然后到udump下查看trace文件。發(fā)現是exu8jbqu這個(gè)view的問(wèn)題。
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‘;
發(fā)現存在。重新執行$ORACLE_HOME/rdbms/admin/catexp.sql 創(chuàng )建視圖。
重新執行exp成功。問(wèn)題解決。
案例三:
環(huán)境 unix+oracle
在做完全導出的時(shí)候,導出表都正常但到導出同義詞時(shí)出錯,錯誤如下:
exporting synonyms
exp-0000 racle error 904 encountered
ora-00904 invalid column name
exp-0000 exp terminaled unsuccessful
使用任何一個(gè)用戶(hù)導出該的數據同樣在這個(gè)地方停住,請問(wèn)這是由于什么情況造成的,該如何解決才能正常exp整個(gè)數據庫呢?之前碰上過(guò)類(lèi)似的情況: 數據庫被改了字符集后,導出時(shí)也是到synonym的時(shí)候出錯誤,報"shortname" 錯誤,后來(lái)把字符集改回原來(lái)安裝的時(shí)候選擇的字符集即可。 使這個(gè)問(wèn)題嗎?
解決方案:原因不是字符集的問(wèn)題,而是同義詞引起的,找出來(lái)將其刪除就可以了。
案例四:Oracle環(huán)境中訪(fǎng)問(wèn)所有的SQL Server字段出錯
問(wèn)題描述:我剛剛從Oracle建立了一條到SQL Server的連接,使用的是普通的連接,我想要執行一條select * from tablename@dblink 的命令。然而,我注意到SQL Server表中所有的字段都無(wú)法在Oracle環(huán)境中訪(fǎng)問(wèn)。當我試圖選擇我認為應該在表中的字段的時(shí)候,我得到ORA-00904的錯誤信息:無(wú)效列名。針對這個(gè)問(wèn)題的可能的解釋和解決方案是什么?
解決方案:當你在你的語(yǔ)句中指定了列名的時(shí)候,確保你用雙引號括住了列名,并且名字是區分大小寫(xiě)的。例如:SELECT "column_A","Column_B" FROM "TableXYz"。
問(wèn)題描述:當我從我的應用程序中運行SQL語(yǔ)句的時(shí)候,我得到如下的錯誤信息:“ORA-00904”無(wú)效列名。我的問(wèn)題是,在不訪(fǎng)問(wèn)系統表的時(shí)候,有沒(méi)有一種方式可以獲得有關(guān)這個(gè)錯誤的更多信息,例如那些無(wú)效的列名?
解決方案:當你獲得這個(gè)消息的時(shí)候運行了什么查詢(xún)?你的答案就在這里。運行的查詢(xún)中的一個(gè)列是無(wú)效的。如果你能運行這個(gè)查詢(xún),那么你就可以看到包括了查詢(xún)中表的信息的“系統表”。只需要開(kāi)啟SQL*Plus 會(huì )話(huà),并且對表(或者一些表)進(jìn)行描述。你的查詢(xún)中的一個(gè)列就不會(huì )是其中一個(gè)表的有效列名了。
如果你不知道SQL語(yǔ)句是什么,那么你就要運行的時(shí)候進(jìn)行追蹤,找出錯誤中的語(yǔ)句。如果你不熟悉,不知道該怎么做的話(huà),需要請求數據庫管理員的幫助。
案例六:查看擁有抽象字段數據類(lèi)型的表中記錄出錯
問(wèn)題描述:我想要查看一個(gè)表中記錄,這個(gè)表中有一個(gè)字段具有抽象的數據類(lèi)型,我創(chuàng )建了如下的類(lèi)型:
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);
/
然后我創(chuàng )建了如下的類(lèi)型體:
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;
/
其次,創(chuàng )建了如下的表:
create table stdmarks
( student_id number(4),
marks marks_ty);
然后,我向其中插入了一些記錄。之后,我執行了如下的語(yǔ)句:
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企業(yè)版中都試過(guò)了。
解決方案:一個(gè)有關(guān)你進(jìn)行的操作的很少被人了解的事實(shí)就是你需要給表名起個(gè)別名,并且在調用成員函數的時(shí)候使用別名。那么,對你的查詢(xún)進(jìn)行如下修改:
SELECT s.marks.totmarks(marks.m1,marks.m2,marks.m3)
FROM stdmarks s;
案例七:探究ORA-00904錯誤信息
問(wèn)題描述:我注意到您對ORA-00904錯誤信息的解答,這個(gè)ORA-00904錯誤信息是在鏈接SQL 服務(wù)器數據庫表之后,試圖對不同類(lèi)型的列進(jìn)行選擇時(shí)出現的。您的答案說(shuō),每個(gè)列都需要用雙引號來(lái)包圍。這樣做好嗎?我們有一個(gè)應用程序,但是我們并不希望有這樣的限制。這里面有什么考慮嗎?
解決方案:你可以試試看,改變你的SQL服務(wù)器實(shí)例的校驗,使它不為默認情況下的大小寫(xiě)敏感。此時(shí),表名“MyTable”和“MYTABLE”指的是同一個(gè)表。
聯(lián)系客服