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

SQL Oracle Discussion :

Probleme avec UTL_FILE.FREMOVE


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut Probleme avec UTL_FILE.FREMOVE
    Bonjour

    Je travaille sur Oracle 10g et je débute avec les procédures stockées.

    J'aimerais créer une procèdure stockée en utilisant Le paquetage UTL_FILE
    pour supprimer des fichiers texte situés dans les répertoires du système d'exploitation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    UTL_FILE.FREMOVE (
    repertoire IN VARCHAR2,
    fichier IN VARCHAR2)
     
    -- repertoire représente le répertoire Oracle
    -- fichier représente le nom du fichier avec son extension
    Mais je ne sais pas trop comment utiliser ce code dans ma procèdure stockée!
    Quelle sera la forme de ma procedure stockée?

    Si quelqu'un a déja utilisé le Le paquetage UTL_FILE ou la fonction UTL_FILE.FREMOVE?

    Merci beaucoup pour votre aide!

    Cordialement Philippe

  2. #2
    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
    Syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    utl_file.fremove ('MON_DIRECTORY', 'mon_fichier.log');
    Pour plus d'infos sur le package utl_file :
    http://sheikyerbouti.developpez.com/...?page=Chap8#L8
    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.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    Merci Plainer d'avoir répondu

    J'ai mis le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE OR REPLACE PROCEDURE OKAIDI.SUPPRESSION_FICHIER AS
    BEGIN
    -- Suppression d'un fichier sur disque
    utl_file.fremove ('C:\Program Files\Oracle\Test', 'test.log');
    END;
    et j'obtiens l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ORA-29280: chemin de répertoire non valide
    ORA-06512: à "SYS.UTL_FILE", ligne 243
    ORA-06512: à "SYS.UTL_FILE", ligne 1126
    ORA-06512: à "OKAIDI.SUPPRESSION_FICHIER", ligne 4
    ORA-06512: à ligne 2

    Je ne comprends pas qu'il ne trouve pas mon repertoire ('Test')
    J'ai pris le repertoire Oracle comme répertoire de Base

    Merci pour votre aide

  4. #4
    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
    Lis le code que j'ai écrit : je n'ai pas mis de chemin mais un directory oracle.

    NB : par ailleurs utl_file ne permet d'agir que sur les répertoires visibles depuis le serveur où est la base de données.
    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.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    Lis le code que j'ai écrit : je n'ai pas mis de chemin mais un directory oracle.

    NB : par ailleurs utl_file ne permet d'agir que sur les répertoires visibles depuis le serveur où est la base de données.
    Merci pour votre aide mais ça ne marche toujours pas

    En me connectant en ssh sur le serveur, j'ai créé un repertoire 'Test' (qui est visible depuis serveur ou est la base de données) et dans ce répertoire j'ai créée un fichier 'test.log'

    Cependant j'ai encore des erreurs! Je ne comprends pas pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE OR REPLACE PROCEDURE OKAIDI.SUPPRESSION_FICHIER AS
    BEGIN
    -- Suppression d'un fichier sur disque
    utl_file.fremove ('Test', 'test.log');
    END;
    Les erreurs affichées sont:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ORA-29280: chemin de répertoire non valide
    ORA-06512: à "SYS.UTL_FILE", ligne 243
    ORA-06512: à "SYS.UTL_FILE", ligne 1126
    ORA-06512: à "OKAIDI.SUPPRESSION_FICHIER", ligne 4
    ORA-06512: à ligne 2
    Cordialement Philippe

  6. #6
    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
    1. Comment as-tu créé ton directory (syntaxe, compte oracle...)
    2. Quels droits (grant) lui as-tu donné ?
    3. Le nom du directory oracle doit être en majuscules quand tu l'appelles
    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.

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    1. Comment as-tu créé ton directory (syntaxe, compte oracle...)
    2. Quels droits (grant) lui as-tu donné ?
    Je me suis connecté a ma base de données Oracle et j'ai tapé la synthaxe ci dessous pour créer mon directory:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE directory Nouveau AS 'c:\temp\';
    GRANT READ,WRITE ON directory Nouveau TO Philippe;

    3. Le nom du directory oracle doit être en majuscules quand tu l'appelles
    J'ai pris ta remarque en compte, j'ai appellé mon directory en majuscules.
    Mais j'ai toujours les memes erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create or replace PROCEDURE        SUPPRESSION_FICHIER AS
    BEGIN
    -- Suppression d'un fichier sur disque
    utl_file.fremove ('NOUVEAU', 'test.log');
    END;
    Comment je peux faire pour voir tous mes directory?
    Je suis perdu!!

    Merci pour ton aide

    Philippe

  8. #8
    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
    le répertoire c:\temp existe bien sur le serveur de bases de données ? Le compte propriétaire d'oracle a bien les droits en écriture dessus ? Que donne le script suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    declare
      v_id utl_file.file_type;
    begin
      v_id:=utl_file.fopen ('NOUVEAU', 'test.txt', 'w');
      utl_file.fclose (v_id);
    end;
    /
    Pour voir tous les directories créés, il faut consulter la table all_directories.
    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.

  9. #9
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    le répertoire c:\temp existe bien sur le serveur de bases de données ?
    Oui le répertoire c:\temp existe bien sur le serveur de la base de données

    Le compte propriétaire d'oracle a bien les droits en écriture dessus ?
    J'ai donné tous les droits a tout le monde pour ne pas avoir de problèmes

    Pour voir tous les directories créés, il faut consulter la table all_directories.
    Je me suis connecté sous l'utilisateur SYSTEM a ma base de données, j'ai tappé la commande: SELECT * FROM ALL_DIRECTORIES pour lister tous les répertoires qui sont créés.

    J'ai éxécuté la commande:
    CREATE DIRECTORY NOUVEAU AS 'c:\Temp' ;
    GRANT READ, WRITE ON DIRECTORY NOUVEAU TO Philippe;

    J'ai vérifié que le directory NOUVEAU était bien crée grace a la commande
    SELECT * FROM ALL_DIRECTORIES

    Je me suis reconnecté a ma base mais sous l'utilisateur Philippe

    J'ai utilisé ton script :

    declare v_id utl_file.file_type;
    begin v_id:=utl_file.fopen ('NOUVEAU', 'test.log', 'w');
    utl_file.fclose (v_id); end; /

    Le script que tu m'as donné provoque les erreurs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Connecting to the database
    ORA-29283: opération non valide sur le fichier
    ORA-06512: à "SYS.UTL_FILE", ligne 243
    ORA-06512: à "SYS.UTL_FILE", ligne 1126
    ORA-06512: à "OKAIDI.SUPPRESSION_FICHIER", ligne 4
    ORA-06512: à ligne 2
    Process exited.
    Disconnecting from the database
    Je ne comprends pas pourquoi ça ne marche pas!

    Merci pour votre aide si vous voyez mon ou mes erreurs

    Cordialement Philippe qui commence a tourner en rond

  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
    Par défaut
    Quels sont les droits sur ton fichier test.log ?
    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
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    J'ai mis tous les droits pour mon fichier test.log!

  12. #12
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    J'aimerais savoir si j'ai la bonne méthode!

    http://www.developpez.net/forums/sho...95&postcount=9

    Si la réponse est "non"! Est ce que vous pouvez me détailler sous forme de plan les étapes pour résoudre mon probleme

    Merci par avance

    Philippe

  13. #13
    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
    Oui ce que tu fais me semble correct :
    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
    SQL>connect sys/manager@base10g as sysdba
    Connecté.
     
    SQL>create directory dir_utl_file as 'C:\UTL_FILE';
    Répertoire créé.
     
    SQL>grant read, write on directory dir_utl_file to test;
    Autorisation de privilèges (GRANT) acceptée.
     
    SQL>connect test/test@base10g
    Connecté.
     
    SQL>declare
      2     v_id_fic utl_file.file_type;
      3  begin
      4    v_id_fic := utl_file.fopen ('DIR_UTL_FILE', 'test.log', 'w');
      5    utl_file.fclose (v_id_fic);
      6  end;
      7  /
    Procédure PL/SQL terminée avec succès.
     
    SQL>begin
      2    utl_file.fremove ('DIR_UTL_FILE', 'test.log');
      3  end;
      4  /
    Procédure PL/SQL terminée avec succès.
    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.

  14. #14
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    Tu as testé ce code et ça marche?

  15. #15
    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
    Oui, ça marche, ce que j'ai indiqué c'est la copie de ce que j'ai dans SQL*Plus.
    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.

  16. #16
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    J'ai repris exactement ton code et j'ai des erreurs!
    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
     
    Error starting at line 1 in command:
    declare
      v_id_fic utl_file.file_type;
      begin
      v_id_fic := utl_file.fopen ('DIR_UTL_FILE', 'test.log', 'w');
      utl_file.fclose (v_id_fic);
      end;
     
    Error report:
    ORA-29283: opération non valide sur le fichier
    ORA-06512: à "SYS.UTL_FILE", ligne 475
    ORA-29283: opération non valide sur le fichier
    ORA-06512: à ligne 4
     
    anonymous block completed
    Mais je pense savoir pourquoi!
    En faite, la base de données Oracle est sur une machine distante (Linux) donc a mon avis elle ne peut pas accèder à mon repertoire qui se trouve sur ma machine!

    Qu'en penses tu?

    Comment je peux corriger ce bug?

    Merci pour ton aide

  17. #17
    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
    Mon deuxième post :
    Citation Envoyé par plaineR
    NB : par ailleurs utl_file ne permet d'agir que sur les répertoires visibles depuis le serveur où est la base de données.
    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.

  18. #18
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    Oui j'ai relu tes post!

    J'ai recréé un directory Oracle a partir d'un répertoire visible depuis le serveur où est la base de données.

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    -- Connection a la base de données en temps que SYSTEM
    create directory dir as '/usr/lib/oracle/xe/Temp';
    grant read, write on directory dir to Philippe
     
    --Connection a la base de données en temps que Philippe;
    declare
      v_id_fic utl_file.file_type;
      begin
      v_id_fic := utl_file.fopen ('DIR', 'test.log', 'w');
      utl_file.fclose (v_id_fic);
      end;
      /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ORA-29283: opération non valide sur le fichier
    ORA-06512: à "SYS.UTL_FILE", ligne 475
    A quoi correspond ce SYS.FILE?

    Ce que je ne comprends pas c'est que j'obtiens exactement la meme erreur que précèdemment!!!

  19. #19
    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
    SYS.UTL_FILE c'est le package UTL_FILE (SYS étant le user oracle)

    L'utilisateur système propriétaire d'oracle a-t-il les droits en écriture sur le répertoire '/usr/lib/oracle/xe/Temp' ?

    Si le fichier test.log existe déjà, met un autre nom.
    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.

  20. #20
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    SYS.UTL_FILE c'est le package UTL_FILE (SYS étant le user oracle)

    L'utilisateur système propriétaire d'oracle a-t-il les droits en écriture sur le répertoire '/usr/lib/oracle/xe/Temp' ?

    Si le fichier test.log existe déjà, met un autre nom.
    Oui j'ai vérifié, l'utilisateur propriétaire d'oracle a tous les droits sur le répertoire '/usr/lib/oracle/xe/Temp' donc il a le droit d'ecriture

    Le fichier test.log existait deja donc j'ai donné un autre nom et ça marche!
    Avec ton script ça m'a crée un fichier et avec la fonction utl_file.fremove j'arrive a le supprimer! Donc c'est parfait!

    Merci beaucoup pour ton aide


    PS:Mon problème est resolu mais j'ai une autre question a vous poser!

    En faite, je vais appeler ma Procèdure Stockée dans mon Shell Script.
    Grace a ma Procèdure Stockée, je vais pouvoir supprimer des fichiers, cependant le noms des fichiers à supprimer changent.
    Le nom des fichiers a supprimer est stocké dans une variable ($i), elle est dans mon Script Shell!

    Comment je peux faire pour appeler et utiliser cette variable dans ma Procedure Stocké afin de préciser les fichiers à supprimer?

    Merci pour votre aide

    Cordialement Philippe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme de longueur avec utl_file
    Par Plumet dans le forum Oracle
    Réponses: 3
    Dernier message: 10/10/2005, 11h32
  2. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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