如何使用问号PreparedStatement(Java)?
我想通过JDBC在oracle数据库中创建一个java源对象,如何使用问号PreparedStatement(Java)?,java,jdbc,prepared-statement,Java,Jdbc,Prepared Statement,我想通过JDBC在oracle数据库中创建一个java源对象,PreparedStatement。但是,在java源文件中,有几个问号。一旦我执行了它,我就会遇到如下错误消息 java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). 我修改了代码,使其更易于理解 private void installOS_COMMAND() { Connecti
PreparedStatement
。但是,在java源文件中,有几个问号。一旦我执行了它,我就会遇到如下错误消息
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
我修改了代码,使其更易于理解
private void installOS_COMMAND() {
Connection targetDBconn = null;
PreparedStatement pstmt = null;
Statement stmt = null;
try {
String SQL = "create or replace java source named \"FILE_TYPE_JAVA\" as\n"
+ "public class FileType {\n"
+ " public static String getFileTypeOwner(Connection con) throws Exception {\n"
+ " String sFileTypeOwner = null;\n"
+ " CallableStatement stmt = con.prepareCall(\"begin dbms_utility.name_resolve(?,?,?,?,?,?,?,?); end;\");\n"
+ " stmt.setString(1, \"FILE_TYPE\");\n"
+ " stmt.setInt(2, 7);\n"
+ " stmt.registerOutParameter(3, java.sql.Types.VARCHAR);\n"
+ " stmt.registerOutParameter(4, java.sql.Types.VARCHAR);\n"
+ " stmt.registerOutParameter(5, java.sql.Types.VARCHAR);\n"
+ " stmt.registerOutParameter(6, java.sql.Types.VARCHAR);\n"
+ " stmt.registerOutParameter(7, oracle.jdbc.OracleTypes.NUMBER);\n"
+ " stmt.registerOutParameter(8, oracle.jdbc.OracleTypes.NUMBER);\n"
+ " stmt.execute();\n"
+ " sFileTypeOwner = stmt.getString(3);\n"
+ " stmt.close();\n"
+ " return sFileTypeOwner;\n"
+ " }\n"
+ "}";
targetDBconn = globalTargetConn.connect();
pstmt = targetDBconn.prepareStatement(SQL);
pstmt.executeUpdate();
} catch (SQLException ex) { logWriter.writeLogs(logTextArea, LogWriter.ERROR, ex.getMessage());
} finally {
if (pstmt != null ) try {pstmt.close();} catch(SQLException ex) {}
if (targetDBconn != null ) try {targetDBconn.close();} catch(SQLException ex) {}
}
}
有人能解决这个问题吗?不要使用预先准备好的语句:
private void installOS_COMMAND() {
Connection targetDBconn = null;
Statement stmt = null;
try {
String SQL = "create or replace java source named \"FILE_TYPE_JAVA\" as\n"
+ "public class FileType {\n"
+ " public static String getFileTypeOwner(Connection con) throws Exception {\n"
+ " String sFileTypeOwner = null;\n"
+ " CallableStatement stmt = con.prepareCall(\"begin dbms_utility.name_resolve(?,?,?,?,?,?,?,?); end;\");\n"
+ " stmt.setString(1, \"FILE_TYPE\");\n"
+ " stmt.setInt(2, 7);\n"
+ " stmt.registerOutParameter(3, java.sql.Types.VARCHAR);\n"
+ " stmt.registerOutParameter(4, java.sql.Types.VARCHAR);\n"
+ " stmt.registerOutParameter(5, java.sql.Types.VARCHAR);\n"
+ " stmt.registerOutParameter(6, java.sql.Types.VARCHAR);\n"
+ " stmt.registerOutParameter(7, oracle.jdbc.OracleTypes.NUMBER);\n"
+ " stmt.registerOutParameter(8, oracle.jdbc.OracleTypes.NUMBER);\n"
+ " stmt.execute();\n"
+ " sFileTypeOwner = stmt.getString(3);\n"
+ " stmt.close();\n"
+ " return sFileTypeOwner;\n"
+ " }\n"
+ "}";
targetDBconn = globalTargetConn.connect();
stmt = targetDBconn.createStatement();
stmt.setEscapeProcessing(false);
stmt.executeUpdate(SQL);
} catch (SQLException ex) { logWriter.writeLogs(logTextArea, LogWriter.ERROR, ex.getMessage());
} finally {
if (targetDBconn != null ) try {targetDBconn.close();} catch(SQLException ex) {}
}
}
什么是
SqlList.createFILE\u TYPE\u JAVA\u javasourceSQL
?这就是我在上面的create或replace语句中提到的查询。在上面的代码中找不到该查询。请包括我们了解问题所需的绝对最低要求,删除不相关的东西,比如你的日志代码。如果你不使用参数替换,那么考虑只使用<代码>语句<代码>,而不是使用这个特定的任务的<代码> Loggable语句< /C>。抱歉,这些不是真正的java源代码,我不能输入整个代码,因为它太长了。该SQL字符串是整个代码的一小部分。无论如何,如果我试图查询包含问号的整个代码,就会出现错误。谢谢你的回答,但我不想在表中输入行。我只是想使用preparedstatement在oracle数据库中立即创建一个java源对象。无论如何,您发布的代码尝试将SQL字符串中的java代码(包括第一行中的非java注释)评估为SQL,这将失败。此链接解释如何将java源对象放入数据库。我的意思是,我正试图直接使用jdbc(preparedstatement)创建java源对象。对不起我的英语:(啊,你可以使用一个正则语句(不是一个prepared语句),也可以使用一个带有java代码的prepared语句作为参数。看看一些例子,PreparedStatements在CREATE java上可能不起作用。因此,只使用正则语句。