我試圖運行Oracle的CREATE JAVA語句。可調用語句錯誤:缺少索引:: 1處的IN或OUT參數
我們不得不將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;
}
}
}
這是使用ojdbc6.jar運行(如JDBC驅動程序)在11gR2 Oracle數據庫上。
如果您移除冒號,它可以工作嗎?最後一個字符'/'不是一個PLSQL命令,而是一個SQL * Plus命令,並且不可能在java中工作。 –
我的不好。在對數據庫運行之前,我們通常會對PL/SQL代碼進行各種格式化。結尾的'/'通常會被刪除。我編輯了我的問題以刪除'/'。當移除冒號時,代碼運行良好。 –
如果您使用常規的'Statement'而不是'CallableStatement',它會工作嗎? –