2014-02-19 35 views
1

我試圖運行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數據庫上。

+1

如果您移除冒號,它可以工作嗎?最後一個字符'/'不是一個PLSQL命令,而是一個SQL * Plus命令,並且不可能在java中工作。 –

+0

我的不好。在對數據庫運行之前,我們通常會對PL/SQL代碼進行各種格式化。結尾的'/'通常會被刪除。我編輯了我的問題以刪除'/'。當移除冒號時,代碼運行良好。 –

+1

如果您使用常規的'Statement'而不是'CallableStatement',它會工作嗎? –

回答

1

它應該工作,如果您使用Statement而不是CallableStatement

對於所有DDL,您應該使用Statement,對於DML應該使用PreparedStatement,對於過程調用,應該使用CallableStatement。創建一個過程是DDL。

A CallableStatement將嘗試檢測並綁定由冒號:標識的變量,所以這可能是您的代碼無法工作的原因。

+0

請注意,如果沒有Statement.setEscapeProcessing(false),我有以下錯誤:'位置[']不受支持的SQL92標記'。感謝文森特! –

+0

你是否還需要''setEscapeProcessing(false)''語句'? –

+0

是的,在我的情況下,它會抱怨'如果我沒有,位置[']不受支持的SQL92令牌。 –

相關問題