Créer une stored procedure Java a partir de Java
Bonjours,
J'essaie de créer une stored procedure java qui soit à meme de lancer un TKprof sur le serveur à partir de mon client. Le code suivant fonctionne si je lance la creation et l'execution de la stored procedure dans SQLPLUS mais je ne peux pas le lancer a partir de mon client Java :
"java.sql.SQLException: non supported SQL92 token at position : 87"
Le code fonctionne jusqu'a ORACLE_HOME qui est effectivement retourné mais le sqlCmd suivant censé tourner un tkprof provoque l'erreur : pas moyen de lui faire creer la fonction java dont je sais que ce même code fonctionne en sqlplus:
(arg est en fait le ficher source trace and /tmp/ff2.prf le fichier en output que j'irais chercher avec dbms_lob.read.)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
private void do_tkprof(){
// full path and name du trace file dont le sid est donné.
String trcFile =
GV.getValueStr(conn, "select c.value || '/' || lower(d.instance_name) || '_ora_' || a.spid || '.trc' " +
" from v$process a, v$session b, v$parameter c, v$instance d\n" +
" where a.addr = b.paddr\n" + " and b.sid = " +
sid + " and c.name = 'user_dump_dest'");
System.out.println("trcfile=" + trcFile);
// extraire l'oracle_home de l'instance pour trouver le full path de tkproff.
String ORACLE_HOME="";
String sqlCmd="declare\n" +
"OH varchar2(100);\n" +
" begin\n" +
" dbms_system.get_env('ORACLE_HOME', OH);\n" +
" :1:=OH;" +
"end;";
CallableStatement stmt;
try {
stmt = conn.prepareCall(sqlCmd);
stmt.registerOutParameter(1,Types.VARCHAR);
stmt.execute();
ORACLE_HOME=stmt.getString(1);
stmt.close();
} catch (SQLException e) {
GV.display_msg_box(this,e.toString() );
}
System.out.println("Oracle_home=" + ORACLE_HOME) ;
// maintenant on execute le tkprof
// la variable 'arg' contient le full path du fichier a traiter
sqlCmd="create or replace and compile\n" +
"java source named exec_cmd_j\n" +
"as\n" +
"public class exec_cmd_j {\n" +
" public static String doit_j(String arg)\n" +
" {\n" +
" String ret=\"job done\";\n" +
" try {\n" +
" Process p = Runtime.getRuntime().exec(\""+ORACLE_HOME+"/bin/tkprof \" + arg + \" /tmp/ff2.prf\");\n" +
" p.waitFor();\n" +
" }\n" +
" catch (Exception e) {\n" +
" ret=\"Error : \" + e.toString(); }\n" +
" finally\n" +
" {\n" +
" return ret;\n" +
" }\n" +
" }\n" +
"}\n" ;
System.out.println("sqlCmd=" + sqlCmd);
// voici notre wrapper PL/SQL de la fonction java
String sqlCmd1="create or replace\n" +
"function doit_j( p_cmd in varchar2) return varchar2\n" +
"as\n" +
"language java\n" +
"name 'exec_cmd_j.doit_j(java.lang.String) return String';\n";
System.out.println("sqlCmd1=" + sqlCmd1);
String sqlCmd2="select doit_j('" + trcFile + "') from dual";
try {
stmt = conn.prepareCall(sqlCmd);
stmt.execute();
stmt = conn.prepareCall(sqlCmd1);
stmt.execute();
stmt.close();
String ret=GV.getValueStr(conn,"select doit_j('" + trcFile + "') from dual");
System.out.println("ret=" + ret);
} catch (SQLException e) {
GV.display_msg_box(this,e.toString() );
}
} |