如何在JDBC上执行此Oracle语句

时间:2014-09-28 01:29:47

标签: java oracle jdbc

使用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

我正在研究与数据库无关的解决方案,因此我需要一些可移植的东西。那么什么是oracle的问题?

2 个答案:

答案 0 :(得分:1)

不需要编写我们自己的存储过程。 Oracle提供了我们可以使用的内置存储过程:DBMS_UTILITY.EXEC_DDL_STATEMENT

 DBMS_UTILITY.EXEC_DDL_STATEMENT('create table t1 (id number)');

实际上,这比the workaround procedure suggested in the accepted answer更安全,因为它不允许执行DML,因此可以防止SQL注入

答案 1 :(得分:0)

使用oracle.jdbc.OraclePreparedStatement

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

由于这对Oracle非常具体,因此常规PrepareStatement无效。 Oracle提供了相同的包装器,还有其他功能。

同样,Oracle提供的OracleCallableStatementCallableStatement

类似

WorkAround:(必须使用PreparedStatement时 - 被滥用的风险

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

Reference JavaDoc