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 305
    Points
    1 305
    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&#40;'SCHEMA-NAME', 'java.io.FilePermission', '<>', 'read ,write, execute, delete'&#41;;
     
    EXEC Dbms_Java.Grant_Permission&#40;'SCHEMA-NAME', 'SYS&#58;java.lang.RuntimePermission', 'writeFileDescriptor', ''&#41;;
     
    EXEC Dbms_Java.Grant_Permission&#40;'SCHEMA-NAME', 'SYS&#58;java.lang.RuntimePermission', 'readFileDescriptor', ''&#41;;
    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&#40;1000000&#41;;
    BEGIN
      Host_Command &#40;p_command => 'move C&#58;\test1.txt C&#58;\test2.txt'&#41;;
    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 305
    Points
    1 305
    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 : 44
    Localisation : France

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 967
    Points : 19 070
    Points
    19 070
    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
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  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&#40;LyceeNum&#41;  -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 : 44
    Localisation : France

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 967
    Points : 19 070
    Points
    19 070
    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 : 44
    Localisation : France

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 967
    Points : 19 070
    Points
    19 070
    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&#40;LyceeNum&#41;  -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 ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  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.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  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 ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  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 : 44
    Localisation : France

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 967
    Points : 19 070
    Points
    19 070
    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