2014-09-28 42 views
1

我有執行使用JDBC預備語句如下麻煩:如何執行此Oracle聲明JDBC

CREATE OR REPLACE TRIGGER Time_trg BEFORE INSERT ON Time FOR EACH ROW 
BEGIN 
    SELECT Time_seq.NEXTVAL INTO :new.id FROM dual; 
END; 

代碼:

try { 
    PreparedStatement statement = connection.prepareStatement(sql); 
    preparedStatement.executeUpdate(); 
} finally { 
    statement.close(); 
} 

我得到這個錯誤:

java.sql.SQLException: Missing IN or OUT parameter at index:: 1 

我工作的一個數據庫無關的解決方案,所以我需要的東西,是便攜式的。那麼,甲骨文的問題是什麼?

+0

問題風險的PreparedStatement的命名參數語法與Oracle的衝突:新語法,並且無法在PreparedStatements中轉義命名參數。因此,您已經使用了一個Statemen而不是PreparedStatement來顛覆這個小問題。 – chubbsondubs 2014-09-29 20:25:56

回答

0

使用oracle.jdbc.OraclePreparedStatement

OraclePreparedStatement statement = (OraclePreparedStatement)connection.prepareStatement(sql); 

由於這是非常特定於Oracle,定期PrepareStatement於事無補。 Oracle爲此提供了一個包裝器,並具有其他功能。

同樣,Oracle提供OracleCallableStatement類似CallableStatement

解決方法:(當PreparedStatement的已使用 - 被濫用

CREATE PROCEDURE EXECUTE_MY_DDL(INSTRING VARCHAR2) 
AS 
BEGIN 
    EXECUTE IMMEDIATE INSTRING; 
END; 

Reference JavaDoc

+0

感謝您的回答,但我需要一個便攜式解決方案。我不想使用OraclePreparedStatement,因爲這不適用於任何其他數據庫。還有什麼可以做的? – chubbsondubs 2014-09-28 02:04:26

+1

不幸的是,你不能這樣做,因爲':something'有特殊的含義。你可以嘗試將這個字符串傳遞給'PL/SQL'塊else。使用'EXECUTE IMMEDIATE' ..雖然不是一個乾淨的修復。 – 2014-09-28 02:07:03

+0

原來我在引擎蓋下使用了OraclePreparedStatement。堆棧跟蹤顯示OraclePreparedStatement。似乎如果我使用它,那麼我將不得不做一些特定的API來使它工作。那會是什麼? – chubbsondubs 2014-09-28 02:08:54