Callablestatement错误:索引:: 1处缺少IN或OUT参数

时间:2014-02-19 12:23:20

标签: java sql oracle jdbc

我正在尝试运行Oracle的 CREATE JAVA 语句。

我们必须将CallableStatement.setEscapeProcessing设置为false以避免问号出现问题。这适用于我们的大多数语句,但在Java switch语句的情况下,我们将获得以下异常:


java.sql.SQLException: Missing IN or OUT parameter at index:: 1

我认为它与switch语句中使用的冒号有关。

以下是问题的一个示例:

JDBCTest.java

package jdbctest;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;

public class JDBCTest {

    public static void main(String[] args) throws Exception {
        String data = readScript("/tmp/Demo.sql");        

        Connection conn = null;
        CallableStatement callStat = null;
        try {
            String driver = "oracle.jdbc.driver.OracleDriver";
            String url = "jdbc:oracle:thin:@193.53.40.220:1521:ora11";
            String username = "";
            String password = "";

            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);
            conn.setAutoCommit(false);
            callStat = conn.prepareCall(data);
            callStat.setEscapeProcessing(false);
            callStat.execute();
        } finally {
            try {callStat.close();} catch (Exception ex){}
            try {conn.close();} catch (Exception ex){}
        }

    }

    private static String readScript(String filename) throws IOException
    {
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader reader = null;
        try {
            String currentLine;
            reader = new BufferedReader(new InputStreamReader(
                    new FileInputStream(filename), "ISO-8859-1"));

            while ((currentLine = reader.readLine()) != null) {
                currentLine = currentLine.replaceAll("^\\s+$", "");
                currentLine = currentLine.replaceAll("\\s+$", "");
                stringBuilder.append(currentLine).append("\n");
            }
        } finally {
            try { reader.close();} catch (Exception ex) {}            
        }

        return stringBuilder.toString();
    }

}

Demo.sql

CREATE OR REPLACE JAVA SOURCE NAMED "jdbctest" AS

package jdbctest;

public class Demo {
    public void test()
    {
        int a = 3;
        switch (a)
        {
            case 1: System.out.println("1"); break;
            case 2: System.out.println("2"); break;
            case 3: System.out.println("3"); break;
        }
    }
}

这是在11gR2 Oracle数据库上使用ojdbc6.jar(作为JDBC驱动程序)运行的。

1 个答案:

答案 0 :(得分:1)

如果您使用Statement而不是CallableStatement,它应该可以使用。

您应该将Statement用于所有DDL,PreparedStatement用于DML,CallableStatement用于过程调用。创建过程是DDL。

CallableStatement将尝试检测并绑定由冒号:标识的变量,因此这可能是您的代码无效的原因。