IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Lancement d'un shell Unix dans un proc stockée [FAQ]


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Lancement d'un shell Unix dans un proc stockée
    Est-il possible de lancer un shell UNIX (ou une commande système) à partir d'une procédure stockée?

    Je suis en Oracle 8.1.7 sous SUN Solaris

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Pour exécuter une commande système depuis du PL/SQL nous allons utiliser une classe Java. La création d'un classe java exécutable en PL/SQL passe par trois étapes : tout d'abord on créé la Java Source, ensuite on publie la spécification d'appel de cette source et enfin on accorde les privilèges nécessaires à l'exécution de cette classe Java.

    Donc on va tout d'abord créer la classe Java permettant d'exécuter une commande système:

    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
    CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Host" AS
    import java.io.*;
    public class Host {
      public static void executeCommand(String command) {
        try {
          String[] finalCommand;
          if (isWindows()) {
            finalCommand = new String[4];
            finalCommand[0] = "C:\\windows\\system32\\cmd.exe";
            finalCommand[1] = "/y";
            finalCommand[2] = "/c";
            finalCommand[3] = command;
          }
          else {
            finalCommand = new String[3];
            finalCommand[0] = "/bin/sh";
            finalCommand[1] = "-c";
            finalCommand[2] = command;
          }
     
          final Process pr = Runtime.getRuntime().exec(finalCommand);
          new Thread(new Runnable() {
            public void run() {
              try {
                BufferedReader br_in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
                String buff = null;
                while ((buff = br_in.readLine()) != null) {
                  System.out.println("Process out :" + buff);
                  try {Thread.sleep(100); } catch(Exception e) {}
                }
                br_in.close();
              }
              catch (IOException ioe) {
                System.out.println("Exception caught printing process output.");
                ioe.printStackTrace();
              }
            }
          }).start();
     
          new Thread(new Runnable() {
            public void run() {
              try {
                BufferedReader br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
                String buff = null;
                while ((buff = br_err.readLine()) != null) {
                  System.out.println("Process err :" + buff);
                  try {Thread.sleep(100); } catch(Exception e) {}
                }
                br_err.close();
              }
              catch (IOException ioe) {
                System.out.println("Exception caught printing process error.");
                ioe.printStackTrace();
              }
            }
          }).start();
        }
        catch (Exception ex) {
          System.out.println(ex.getLocalizedMessage());
        }
      }
     
      public static boolean isWindows() {
        if (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1)
          return true;
        else
          return false;
      }
     
    };
    /
    show errors java source "Host"

    Ensuite on publie la spécification d'appel de cette classe en utilisant une procédure PL/SQL pour la "wrapper":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE OR REPLACE PROCEDURE Host_Command (p_command  IN  VARCHAR2)
    AS LANGUAGE JAVA 
    NAME 'Host.executeCommand (java.lang.String)';
    /


    Enfin, les permissions nécessaire doivent être données par l'utilisateur SYS pour que le JServer puisse accèder aux fichiers su système:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    EXEC Dbms_Java.Grant_Permission('SCHEMA-NAME', 'java.io.FilePermission', '<>', 'read ,write, execute, delete');
     
    EXEC Dbms_Java.Grant_Permission('SCHEMA-NAME', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
     
    EXEC Dbms_Java.Grant_Permission('SCHEMA-NAME', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
    On doit se reconnecter pour activer les privilèges.

    Ensuite on lance notre commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SET SERVEROUTPUT ON SIZE 1000000
    CALL DBMS_JAVA.SET_OUTPUT(1000000);
    BEGIN
      Host_Command (p_command => 'move C:\test1.txt C:\test2.txt');
    END;
    /

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Lors du lancement de la première commande CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Host" AS....., j'obtiens le message suivant :
    ERROR at line 1:
    ORA-29547: Java system class not available: oracle/aurora/rdbms/Compiler

    Je suppose que je dois faire quelque chose pour pouvoir utiliser cette commande, je ne sais malheureusemebt pas quoi....

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    arg je crois que tu as pas du installer le support java. Je vais voir si je trouve plus d'info

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    pour installer la jvm oracle, tu dois executer le fichier initjvm.sql
    qui se trouve sous :

    $ORACLE_HOME\javavm\install\initjvm.sql

    tu risues d'avoir des souci avec les aprametre java pool du fichier init.ora.
    Si c le cad augmente les...en esperant que tu es assez de RAM..car la JVM est assez gurmande.

    Bon courage

    ps : initjvm.sql doit etre lance sous SYS

  6. #6
    Candidat au Club
    Inscrit en
    Janvier 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Effectivemment, j'ai eu quelques problèmes de java_pool_size, large_pool_size, shared_pool_size.

    J'ai pris les valeurs suivantes :
    java_pool_size = 50M
    large_pool_size = 45M
    shared_pool_size=70M

    J'ai ensuite positionner le LD_LIBRARY_PATH64 sur $ORACLE_HOME/lib64 dans l'environnement UNIX.

    Petite explication dans la procédure de grant :
    EXEC Dbms_Java.Grant_Permission('SCHEMA-NAME', 'java.io.FilePermission', '<>', 'read ,write, execute, delete');
    le '<>' doit être remplacer par le répertoire dans lequel se trouve le shell ou la commande (exemple bin/sh pour la commande ls).

    Ensuite tout roule...

    Merci à tous

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 56
    Points : 28
    Points
    28
    Par défaut
    comment executer une commande système sous oracle si on n'a pas la jvm et que le dba ne peut l'installer ??

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    c'est pas possible

  9. #9
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 56
    Points : 28
    Points
    28
    Par défaut
    je dis à mon chef de projet que c'est pas possible ou c'est une blague ?

  10. #10
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609

  11. #11
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 56
    Points : 28
    Points
    28
    Par défaut
    es tu sur que je peux pas mettre ma commande sys. direct dans ma proc ?
    car elle nécessite un paramètre qu'elle récupère dans le LOOP.
    On peut pas faire un truc de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    --envoi du mail via une commande système à destination de BLAT.EXE 
    --ho blat fichier -t fctn_GetMailRecipient(LyceeNum)  -f moi@domaine.fr 
    	-s \"Le sujet\";

  12. #12
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    pourquoi s'évertuer à ne pas utiliser utl_snmp ?

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par plaineR


    au temps pour moi

  14. #14
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par c_moi_c_moi
    On peut pas faire un truc de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    --envoi du mail via une commande système à destination de BLAT.EXE 
    --ho blat fichier -t fctn_GetMailRecipient(LyceeNum)  -f moi@domaine.fr 
    	-s \"Le sujet\";
    Ca tu peux le faire puisque tout est en commentaires

    Plus sérieusement, c'est quoi ton ho ?

  15. #15
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 56
    Points : 28
    Points
    28
    Par défaut
    on m'a dit que ca permettait d'exécuter une commande système dans une proc. stock., syntaxe de la sorte suivante :

    ho commde systeme

  16. #16
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    A mon avis, c'est l'abréviation de la commande host de SQL*Plus.
    ne fonctionne pas dans une procédure stockée.

  17. #17
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 56
    Points : 28
    Points
    28
    Par défaut
    où dois je donc lancer ma commande sql*plus ?

  18. #18
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Sous SQL*Plus, non ?

  19. #19
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    STOP AU SQUAT DE SUJET !!!!

    c_moi_c_moi continue dans TON sujet !

  20. #20
    Futur Membre du Club
    Inscrit en
    Août 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Comment lancer des requetes SQL sous un Shell Unix ?
    Bonjour aux connaisseurs,

    je voudrais sous Unix/Oracle pouvoir lancer un script Shell dans lequel figurerait des requêtes SQL du genre :

    UPDATE UC10 SET TICONN = '0001-01-01-00.00.00'
    DELETE FROM CO22 WHERE CDUTIL IN ( SELECT CDUTIL FROM UC10 WHERE TYUTIL = 'A')
    DELETE FROM UC10 WHERE TYUTIL = 'A'

    Est-ce possible et comment faire ?
    Merci de me donner les syntaxes de lancement des requêtes SQL en Shell.


+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Appels de procedures stockées dans une proc stockée ?
    Par Nadaa dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 17/07/2008, 10h32
  2. Réponses: 5
    Dernier message: 27/07/2007, 16h21
  3. Exécuter script unix ds une Proc Stock
    Par super_boulet dans le forum Oracle
    Réponses: 1
    Dernier message: 22/12/2006, 11h25
  4. Lancement d'un shell Unix dans un proc stockée
    Par Titouf dans le forum Oracle
    Réponses: 1
    Dernier message: 17/10/2006, 11h55
  5. Réponses: 2
    Dernier message: 12/06/2006, 12h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo