此問題的原因是因為表的列名稱使用了Oracle聲明的關鍵字,列名起的不好引起的。
如果列很多,又不好確定是哪個列名使用了關鍵字,以下建議可供參考:
select * from v$reserved_words where keyword in( select COLUMN_NAME from all_tab_columns where table_name = 'HP_FFS' and owner='用戶名大寫' );
除了與oracle關鍵字段沖突錯誤外(select * from v$reserved_words;--查詢oracle數據庫關鍵字),還有一種可能是po映射時的字段是否與數據庫中的字段匹配,包括檢查有外鍵關聯所關聯的PO中的各個字段映射是否正確。
此外,也有可能是SQL語句查詢插入的列名的最后多了一個“,”逗號等原因,也會引起這種錯誤。
一些具體的解決方案建議:
情形1
1.創建表是不使用ORACLE的關鍵字作為表字段名。
2.oracle 表字段關鍵字的查詢 : 把字段名加上雙引號,並且嚴格區分大小寫。
建議采用第一種方法解決,減少出現其他問題的幾率。
情形2
1、首先我們要確認哪些字符串是Oracle的關鍵字,具體可通過Oracle提供的V$RESERVED_WORDS
2、對歷史遺留系統的處理
- 考慮修改表的列名,風險較大
- 修改特定查詢語句
3、驗證
通過驗證得出結論:
- 在查詢列中使用雙引號
- 要注意列的大小寫
CREATE TABLE WYC_TEST(CODE VARCHAR2(20), ADDR VARCHAR2(40)); INSERT INTO WYC_TEST(CODE,ADDR) VALUES('00', 'ADDR00'); ALTER TABLE WYC_TEST ADD "ROW" VARCHAR2(20); ALTER TABLE WYC_TEST ADD "Row" VARCHAR2(20); ALTER TABLE WYC_TEST ADD "RoW" VARCHAR2(30); INSERT INTO WYC_TEST(CODE,ADDR, "ROW") VALUES('00', 'ADDR00', 'abc'); UPDATE WYC_TEST SET "ROW" = WYC_TEST.ADDR || '_ROW', "Row"=WYC_TEST.ADDR || '_Row', "RoW"=WYC_TEST.ADDR || '_RoW' SELECT * FROM WYC_TEST;
參考文章:
1. 關於報錯“ORA-01747: user.table.column, table.column 或列說明無效”的解決辦法
2. ORA_01747:User.table.column 或列說明無效
3. ORA-01747: user.table.column, table.column 或列說明無效n, table.column 或列