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 : Sélectionner tout - Visualiser dans une fenêtre à part
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() );
        }  
   }