2009-07-21 63 views
0

我有一個有趣的需求。Oracle Java存儲過程命令行交互

我們需要在Java存儲過程中進行命令行交互。儘管使用dbms_java.grant_permission命令授予適當的權限,但我遇到java.io.IOException,其中我使用java.io.InputStreamReaderSystem.in讀取。

問題在哪裏?

Java源代碼是在這裏:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import java.sql.ResultSet; 
import java.sql.Statement; 
import java.sql.Connection; 
import java.sql.SQLException; 


import oracle.jdbc.driver.OracleDriver; 

public class ExecuteInteractiveBatch { 

    public static void aFunction() { 

     Connection connection = null; 
     try { 
      int rowFetched = 0; 

      connection = new OracleDriver().defaultConnection(); 

      Statement stmt = connection.createStatement(); 

      ResultSet rs = stmt.executeQuery("SELECT count(1) cnt from sometable where c = 2"); 

      int count = 0; 
      if (rs.next()) { 
       count = rs.getInt(1); 
      } 
      rs.close(); 
      stmt.close(); 
      rs = null; 
      stmt = null; 
      if (count == 1) { 
       System.out.println("Do you want to continue?"); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
       String response = reader.readLine(); 
       if ("Y".equalsIgnoreCase(response)) { 
        stmt = connection.createStatement(); 
        int rowsAffected = stmt.executeUpdate("DELETE from sometable where c=2"); 
        System.out.println("" + rowsAffected + " row(s) deleted"); 
        stmt.close(); 
       } 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } finally { 

      try { 
       if (connection != null || !connection.isClosed()) { 
        connection.close(); 
       } 
      } catch (SQLException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 
} 
+1

問題在哪裏?可能在堆棧跟蹤中,您未包括該問題。 :) – 2009-07-21 13:53:47

回答

6

您不能在Oracle執行I/O,以控制檯...不是在java中,而不是在PL/SQL,無處。 Oracle運行在與用戶分開的過程中,很可能甚至是一臺不同的計算機,並且Java存儲過程正在該過程中運行。您需要在客戶端系統上運行一些Java代碼才能執行控制檯I/O。