//-----------------------------------------------------------------------------
// ExJDBC5.java
//-----------------------------------------------------------------------------

import java.io.*; // pour la fonction lireClavier uniquement
import java.sql.*;

class ExJDBC5 {

    static void ex55(Connection c) throws SQLException {
	String texte = "delete "+lireClavier("nom table ?");
	// serait pareil si drop table (=/= PL/SQL)
	System.out.println(texte);
	Statement s = c.createStatement();
	s.execute(texte);
	s.close();

	// nom fonction pas connu : int -> int (sans repetition) :
	String texte = "{ ? = call "+lireClavier("nom fonction ?")+"(14)}";
	System.out.println(texte);
	CallableStatement cs = c.prepareCall(texte);
	cs.registerOutParameter(1, Types.INTEGER); 
	cs.execute();
	System.out.println(cs.getInt(1))
	cs.close();
	
	// nom fonction pas connu : int -> int (sans repetition),
	// nom user pas connu : 
	String f = lireClavier("nom fonction ?");
	String u = lireClavier("login unix ");
	String texte = "{ ? = call c##"+u+"_a."+f+"(14)}";
	System.out.println(texte);
	CallableStatement cs = c.prepareCall(texte);
	cs.registerOutParameter(1, Types.INTEGER); 
	cs.execute();
	System.out.println(cs.getInt(1))
	cs.close();
	
    }

    //-------------------------------------------------------------------------
    static void ex6(Connection c) throws SQLException {
	// repetitions appel procedure
	// fonctionne exactement comme pour PreparedStatement :

	String texte = "{ call anniversaire(?) }"; 
	CallableStatement cs = c.prepareCall(texte);
	cs.setString(1, "Riton");
	cs.execute();
	cs.setString(1, "Rita");
	cs.execute();
	cs.close();

	lireClavier("ex6 ???");

	texte = "{ ? = call age(?) }"; 
	cs = c.prepareCall(texte);
	cs.registerOutParameter(1, Types.INTEGER);
	// Rita :
	cs.setString(2, "Rita"); // comme pour PreparedStatement
	cs.execute();
	System.out.println(cs.getInt(1));
	// rebelote pour Riton :
	cs.setString(2, "Riton");
	cs.execute();
	System.out.println(cs.getInt(1));
	cs.close();

	lireClavier("ex6 ???");

	texte = "{ call age_out(?,?) }"; 
	cs = c.prepareCall(texte);
	cs.registerOutParameter(2, Types.INTEGER);
	cs.setString(1, "Rita");
	cs.execute();
	System.out.println(cs.getInt(2));
	cs.setString(1, "Riton");
	cs.execute();
	System.out.println(cs.getInt(2));
	cs.close();
    }

    //-------------------------------------------------------------------------

    static String lireClavier(String message) {
	// Dans cette fonction l'exception est catchee pour ne pas avoir a la 
        // gerer dans le main, et donc mieux voir les exceptions BD. 
	try {
            System.out.print(message);
	    BufferedReader clavier =
		new BufferedReader(new InputStreamReader(System.in));
	    return clavier.readLine();
	} catch (Exception e) {
	    return "erreur dans fonction lireClavier";
	}
    }

    //-------------------------------------------------------------------------
    public static void main(String[] args)
	throws SQLException, ClassNotFoundException {

	Class.forName("oracle.jdbc.driver.OracleDriver");
	Connection c = DriverManager.getConnection
	    (
	   // "jdbc:oracle:thin:ewaller_a/ewaller_a@tp-soracle:1521:dbinfo");
	     "jdbc:oracle:thin:c##ewaller_a/ewaller_a@tp-oracle:1522:dbinfo");

	while (true) {
	    System.out.println("-------------------------------");
	    System.out.println("Bienvenue dans ExJDBC1");
	    System.out.println("1 : bases : ");
	    System.out.println("2 : sequence : ");
	    System.out.println("3 : curseur : ");
	    System.out.println("4 : PreparedStatement : ");
	    System.out.println("5 : appel procedure : ");
	    System.out.println("6 : repetition appel proc : ");
	    System.out.println("7 : if : ");
	    System.out.println("55 : SQL dynamique : ");
	    System.out.println("9 : deconnexion");
	    System.out.println("0 : terminer");
	    int n = Integer.parseInt(lireClavier("Entrez votre choix : "));
	    switch (n) {
	    case 55 : ex55(c); break;
		//	    case 6 : ex6(c); break;
	    case 9 : c.close(); break;
	    case 0 : return;
	    }
	}
    }
}

//-----------------------------------------------------------------------------
