2009-07-21 6 views
0

J'ai une exigence drôle.Oracle Java procédure stockée Interaction de ligne de commande

Nous devons avoir une interaction de ligne de commande dans une procédure stockée Java. En dépit d'accorder des autorisations appropriées en utilisant les commandes dbms_java.grant_permission, je rencontre java.io.IOException, où je lis de System.in en utilisant java.io.InputStreamReader.

Où est le problème?

La source Java est ici:

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

Où est le problème? Probablement dans la trace de la pile que vous n'avez pas incluse dans la question. :) –

+1

peut-être inclure le code que vous avez créé ainsi – northpole

+0

Qu'est-ce qui appelle 'aFunction'? Pourriez-vous nous fournir une trace de pile fournissant des informations d'erreur détaillées? –

Répondre

6

Vous ne pouvez pas effectuer d'E/S à la console à partir d'Oracle ... pas en java, pas dans PL/SQL, nulle part. Oracle s'exécute dans un processus distinct de l'utilisateur, probablement même un ordinateur différent, et les procédures stockées Java sont exécutées dans ce processus. Vous aurez besoin d'un code java en cours d'exécution sur le système client pour exécuter les E/S de la console.

Questions connexes