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”指的是同一個表。