2011-07-03 18 views
12

我得到異常下面,當試圖插入一批行向現有表獲取異常ORA-00942:表或視圖不存在 - 插入到現有的表

ORA-00942的時候:表或視圖不存在

我可以證實,表中分貝存在,並且我可以使用Oracle SQL 顯影劑插入數據到該表。但是當我嘗試在java中使用preparedstatement插入行時,它的throwing表不存在錯誤。

請找出錯誤的下面

java.sql.SQLException: ORA-00942: table or view does not exist 

    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) 
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) 
    at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573) 
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1889) 
    at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093) 
    at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047) 
    at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout>>(OracleStatement.java:2709) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589) 
    at quotecopy.DbConnection.insertIntoDestinationDb(DbConnection.java:591) 
    at quotecopy.QuoteCopier.main(QuoteCopier.java:72) 

堆棧跟蹤任何人都可以提出這個錯誤的原因?

更新:問題解決

有我的數據庫連接屬性或者與我的表或視圖名稱沒有問題。解決問題的辦法很奇怪。我試圖插入的一列是Clob類型。由於我在處理oracle db中的clob數據時遇到了很多麻煩,所以試着用一個臨時字符串setter替換clob setter,並執行相同的代碼,並排除任何問題,並正確插入所有行!!!

即, peparedstatement.setClob(columnIndex,CLOB)

peparedstatement.setString代替(columnIndex, 「字符串」)

爲什麼誤差表或視圖確實存在錯誤是拋出在插入clob數據時出錯。請你能解釋一下嗎?

非常感謝您的回答和評論。

+1

好吧,我想 「表或視圖不存在」。你能向我們展示餐桌定義和你的陳述嗎? – Howard

+0

@aquero:也許打印(並在此處顯示)產生此錯誤的查詢將有所幫助。 –

+1

@aquero:請向我們展示您正在使用的Java代碼。 – Codo

回答

8

我的數據庫連接屬性或我的表或視圖名稱沒有問題。解決問題的辦法很奇怪。我試圖插入的一列是Clob類型。由於我在處理oracle db中的clob數據時遇到了很多麻煩,所以試着用一個臨時字符串setter替換clob setter,並執行相同的代碼,並排除任何問題,並正確插入所有行!!!

即, peparedstatement.setClob(columnIndex,CLOB)

peparedstatement.setString更換(columnIndex, 「字符串」)

1

是您的腳本提供架構名稱,或者你依靠登錄到數據庫的用戶選擇默認模式

可能是因爲您沒有命名模式,並且您使用系統用戶而不是模式用戶執行批處理,導致腳本的錯誤執行上下文,如果該腳本執行的用戶具有目標模式設置爲默認模式。你最好的行動將包括在INSERT語句中的模式名稱:

INSERT INTO myschema.mytable (mycolums) VALUES ('myvalue') 

更新:你嘗試在你準備語句中的表名作爲綁定值綁定?這是行不通的。

+0

我改變了我的插入查詢來包含模式,但仍然得到相同的異常 – aquero

+0

@aquero,你可以編輯你的問題,幷包括語句和準備的Java代碼,綁定值並執行? – rsp

+0

@aquero,請參閱更新。 – rsp

12

如果表存在,Oracle也會報告這個錯誤,但是您沒有任何權限。所以如果你確定桌子在那裏,請檢查補助金。

9

在某些情況下,如果目標表存在並且權限正確,setCLOB()似乎會導致ORA-00942出現問題。我現在有這個確切的問題,我可以通過不將CLOB綁定到同一個表中而使ORA-00942消失。

我試過setClob()java.sql.Clob和setCLOB()與oracle.jdbc.CLOB但具有相同的結果。

正如你所說,如果你綁定爲一個字符串,問題就會消失 - 但是這會限制你的數據大小爲4k。

從測試中看來,在綁定CLOB之前事務在會話上打開時觸發。當我解決這個問題時,我會反饋......檢查Oracle支持。

3

@unbeli是對的。沒有適當的資助表會導致這個錯誤。對於它的價值,我最近經歷了這一點。我遇到了你描述的確切問題,我可以通過SQL開發人員執行插入語句,但在使用休眠時會失敗。我終於意識到我的代碼不僅僅是明顯的插入。插入其他沒有適當授權的表格。調整授予特權爲我解決了這個問題。

注意:沒有評論的評論,否則這可能是評論。

2

我發現如何在不使用JDBC的了setString解決這個問題()方法將數據限制爲4K。

你需要做的是使用preparedStatement.setClob(int parameterIndex,Reader reader)。至少這是對我有用的東西。認爲Oracle驅動程序將數據轉換爲字符流來插入,似乎沒有。或者是某些特定的錯誤。

使用characterStream似乎適用於我。我正在讀取一個數據庫中的表並使用jdbc寫入另一個數據庫。就像上面提到的那樣,我得到了表未找到的錯誤。所以這就是我解決問題的方法:

case Types.CLOB: //Using a switch statement for all columns, this is for CLOB columns 
     Clob clobData = resultSet.getClob(columnIndex); // The source db 
     if (clobData != null) { 
      preparedStatement.setClob(columnIndex, clobData.getCharacterStream()); 
     } else { 
      preparedStatement.setClob(columnIndex, clobData); 
     } 
     clobData = null; 
     return; 

現在都好。

2

我們在BLOB列上遇到過這個問題。就在遇到此錯誤時,在這個問題上以防別人的土地,這裏是我們如何解決這個問題:

我們開始了這一點:

  preparedStatement.setBlob(parameterIndex, resultSet.getBlob(columnName)); break; 

我們通過改變該行這個解決了這個問題:

 java.sql.Blob blob = resultSet.getBlob(columnName); 
     if (blob != null) { 
      java.io.InputStream blobData = blob.getBinaryStream(); 
      preparedStatement.setBinaryStream(parameterIndex, blobData); 
     } else { 
      preparedStatement.setBinaryStream(parameterIndex, null); 
     } 
0

它爲我的作品:

Clob clob1; 
while (rs.next()) { 
    rs.setString(1, rs.getString("FIELD_1")); 

    clob1 = rs.getClob("CLOB1"); 
    if (clob1 != null) { 
     sta.setClob(2, clob1.getCharacterStream()); 
    } else { 
     sta.setClob(2, clob1); 
    } 
    clob1 = null; 

    sta.setString(3, rs.getString("FIELD_3")); 
} 
-1

在這裏,我得到了瞿解決方案estion。如果您使用玻璃魚,問題在於玻璃魚。在創建JNDI名稱時,請確保池名稱正確,並且池名稱是您創建的連接池名稱。

enter image description here

相關問題