我正在尝试运行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驱动程序)运行的。
答案 0 :(得分:1)
如果您使用Statement
而不是CallableStatement
,它应该可以使用。
您应该将Statement
用于所有DDL,PreparedStatement
用于DML,CallableStatement
用于过程调用。创建过程是DDL。
CallableStatement
将尝试检测并绑定由冒号:
标识的变量,因此这可能是您的代码无效的原因。