ORA-00904: invalid identifier 表示引用的欄位名稱不存在或不合法。合法識別符:以字母開頭、≤30 字元、僅含字母數字與 $ _ #,否須雙引號包裹且區分大小寫,且不可為保留字。
CREATE TABLE test ("id" NUMBER);
SELECT id FROM test; -- 錯誤
SELECT "id" FROM test; -- 正確
原因:雙引號強制保留大小寫,Oracle 預設轉大寫,導致大小寫不匹配。
ALTER SYSTEM SET EVENTS '904 TRACE NAME ERRORSTACK';
-- 查 trace 確認視圖異常
@$ORACLE_HOME/rdbms/admin/catexp.sql -- 重建匯出視圖
非字符集問題,實為無效同義詞導致。查出並 DROP SYNONYM 即可。
SELECT "Col_A", "Col_B" FROM "TableXYZ"@dblink; -- 必須雙引號且大小寫一致
SQL Server 對大小寫敏感,Oracle 預設轉大寫,雙引號保留原貌。
直接在 SQL*Plus 執行 DESC table_name 對照,或啟用 SQL Trace 捕捉失敗語句。
-- 錯誤
SELECT marks.totmarks(marks.m1, marks.m2, marks.m3) FROM stdmarks;
-- 正確
SELECT s.marks.totmarks(s.marks.m1, s.marks.m2, s.marks.m3) FROM stdmarks s;
修改 SQL Server 校對規則為不區分大小寫(CI),則 MyTable = MYTABLE,免去雙引號困擾。
catexp.sql 確保系統視圖完整。SELECT * FROM dba_synonyms WHERE table_owner NOT IN (SELECT username FROM dba_users)。