使用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的问题?
答案 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提供的OracleCallableStatement
与CallableStatement
WorkAround:(必须使用PreparedStatement时 - 被滥用的风险
CREATE PROCEDURE EXECUTE_MY_DDL(INSTRING VARCHAR2)
AS
BEGIN
EXECUTE IMMEDIATE INSTRING;
END;