Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用问号PreparedStatement(Java)?_Java_Jdbc_Prepared Statement - Fatal编程技术网

如何使用问号PreparedStatement(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

我想通过JDBC在oracle数据库中创建一个java源对象,
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上可能不起作用。因此,只使用正则语句。