2014-09-28 43 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