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

PL/SQL Oracle Discussion :

Erreur de création de trigger avec UTL_FILE


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    chef de projet technique
    Inscrit en
    avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : chef de projet technique

    Informations forums :
    Inscription : avril 2009
    Messages : 15
    Points : 3
    Points
    3
    Par défaut Erreur de création de trigger avec UTL_FILE
    Bonjour, j'utilise Oracle 19C sur un serveur Unix AIX 7, avec SQLDeveloper je veux créer un trigger sur un delete afin de copier l'enregistrement deleté dans un fichier texte.

    j'ai donc écrit ceci :

    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
    create or replace trigger trg_del_APMFCQ
    before delete on APMFCQ
    for each row
    when ( CURRENT.CODDTQ = 'XVT')
     
    declare
            ID_FILE             UTL_FILE.FILE_TYPE;
            MODE_OPEN           CHAR(1) := 'A';
    begin
    ID_FILE := UTL_FILE.FOPEN('/tmp','trg_del_APMFCQ.log',MODE_OPEN);
    UTL_FILE.PUT_LINE(ID_FILE, old.CODDTQ || ' ' || old.DATCRE || ' ' || old.HEUCRE || ' ' || old.VARDTQ);
    UTL_FILE.FCLOSE(ID_FILE);
     
    end ;
    /
    à la compilation j'ai cette erreur :

    Rapport d'erreur -
    ORA-00936: expression absente
    00936. 00000 - "missing expression"
    *Cause:
    *Action:
    si une âme charitable est sur ce forum et peut me donner un coup de main ??
    Merci d'avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : décembre 2019
    Messages : 1 068
    Points : 1 792
    Points
    1 792
    Par défaut
    Bonjour,

    Ce serait bien d'avoir la ligne en erreur. Mais je vois plusieurs soucis:
    - Dans la clause WHEN tu utilises CURRENT.CODDTQ, mais c'est plutôt OLD.CODDTQ non?

    - Tu as oublié les 2-points pour les :old référencés dans utl_file.put_line. D'ailleurs tu peux simplement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UTL_FILE.PUT_LINE(ID_FILE, :old.CODDTQ || :old.DATCRE || :old.HEUCRE || :old.VARDTQ);
    - Pour UTL_FILE.FOPEN, il faut préciser un directory Oracle, pas un chemin sur le serveur

  3. #3
    Candidat au Club
    Homme Profil pro
    chef de projet technique
    Inscrit en
    avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : chef de projet technique

    Informations forums :
    Inscription : avril 2009
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    Merci de bien vouloir m'aider,

    pour les ":" et le CURRENT, j'avais fait des essais ...

    le problème avec les old dans le PUT_LINE, c'est qu'il ne les reconnait pas :

    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
    create or replace trigger trg_del_APMFCQ
    before delete on APMFCQ
    for each row
    when ( old.CODDTQ = 'XVT')
     
    declare
            ID_FILE             UTL_FILE.FILE_TYPE;
            MODE_OPEN           CHAR(1) := 'A';
    begin
    /*ID_FILE := UTL_FILE.FOPEN('/tmp','trg_del_APMFCQ.log',MODE_OPEN);*/
    ID_FILE := ('/tmp','trg_del_APMFCQ.log',MODE_OPEN);
    UTL_FILE.PUT_LINE(ID_FILE, :old.CODDTQ || ' ' || :old.DATCRE || ' ' || :old.HEUCRE || ' ' || :old.VARDTQ);
    /*UTL_FILE.FCLOSE(ID_FILE);*/
     
    end ;
    /
    à la compilation il me demande d'entrer une valeur de liaison pour "old" .... et si je renseigne "old" comme s'est marqué par défaut, j'ai cette erreur :
    Erreur(5,1): PL/SQL: Statement ignored
    Erreur(5,12): PLS-00382: expression du mauvais type

  4. #4
    Candidat au Club
    Homme Profil pro
    chef de projet technique
    Inscrit en
    avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : chef de projet technique

    Informations forums :
    Inscription : avril 2009
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    Je viens de faire un nouvel essai avec :

    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
    create or replace trigger trg_del_APMFCQ
    before delete on APMFCQ
    for each row
    when ( old.CODDTQ = 'XVT')
     
    declare
            ID_FILE             UTL_FILE.FILE_TYPE;
            MODE_OPEN           CHAR(1) := 'A';
    begin
    ID_FILE := UTL_FILE.FOPEN('/tmp','trg_del_APMFCQ.log',MODE_OPEN);
    UTL_FILE.PUT_LINE(ID_FILE, :old.CODDTQ || ' ' || :old.DATCRE || ' ' || :old.HEUCRE || ' ' || :old.VARDTQ);
    UTL_FILE.FCLOSE(ID_FILE);
     
    end ;
    /
    et là la compilation est OK

    Question : quand tu dis que le répertoire ne doit pas être sur le serveur Unix ??? je ne comprends pas

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : décembre 2019
    Messages : 1 068
    Points : 1 792
    Points
    1 792
    Par défaut
    Il faut créer un répertoire au sens Oracle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create or replace directory TMP_DIR as '/tmp';
    grant read,write on directory TMP_DIR to <user_qui_utilise_la_proc>;
    Et après tu précises ce répertoire dans utl_file.fopen

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UTL_FILE.FOPEN('TMP_DIR','trg_del_APMFCQ.log',MODE_OPEN);

  6. #6
    Candidat au Club
    Homme Profil pro
    chef de projet technique
    Inscrit en
    avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : chef de projet technique

    Informations forums :
    Inscription : avril 2009
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    J'étais arrivé à cette conclusion et j'ai créé le repertoire Oracle puis j'ai donné les permissions à partir de SYSDBA :

    SQL> create or replace directory ora_log as '/tmp';
    
    Directory created.
    
    SQL> grant read,write on directory ora_log to FGE50P087;
    
    Grant succeeded.
    
    SQL> 

    La compilation du trigger :

    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
    create or replace trigger trg_del_APMFCQ
    before delete on APMFCQ
    for each row
    when ( old.CODDTQ = 'XVT')
     
    declare
            ID_FILE             UTL_FILE.FILE_TYPE;
            MODE_OPEN           CHAR(1) := 'A';
    begin
    ID_FILE := UTL_FILE.FOPEN('ora_log','trg_del_APMFCQ.log',MODE_OPEN);
    UTL_FILE.PUT_LINE(ID_FILE, :old.CODDTQ || ' ' || :old.DATCRE || ' ' || :old.HEUCRE || ' ' || :old.VARDTQ);
    UTL_FILE.FCLOSE(ID_FILE);
     
    end ;
    /
    j'ai l'erreur suivante :

    create or replace trigger trg_del_APMFCQ
    before delete on APMFCQ
    for each row
    when ( old.CODDTQ = 'XVT')

    declare
    ID_FILE UTL_FILE.FILE_TYPE
    Rapport d'erreur -
    ORA-00990: privilège absent ou non valide
    00990. 00000 - "missing or invalid privilege"
    *Cause:
    *Action:

  7. #7
    Candidat au Club
    Homme Profil pro
    chef de projet technique
    Inscrit en
    avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : chef de projet technique

    Informations forums :
    Inscription : avril 2009
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    Je vois bien le directory Oracle dans ALL_DIRECTORIES avec le owner = SYS ....
    Si j'essai d'exécuter le package UTL_FILE à partir de mon user ... je n'ai pas les privilèges , pourtant j'ai fait un "GRANT ANY PROCEDURE TO user"

    du coup je ne sais pas si mon user n'a pas les droits sur la création du fichier ou sur l'exécution du du FOPEN ...

Discussions similaires

  1. Erreur de syntaxe sur trigger avec mysql 5.1
    Par WhoIsTiti dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 29/03/2012, 07h18
  2. erreur ORA-06502 avec UTL_FILE
    Par leftyy dans le forum PL/SQL
    Réponses: 1
    Dernier message: 03/11/2010, 17h14
  3. [XL-2007] Erreur 1004 lors de la création de TCD avec l'enregistreur de macro
    Par ryobanga dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/02/2010, 15h35
  4. [MySQL] MySQL: erreur syntax création de trigger
    Par hammag dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/05/2009, 12h30
  5. PB AVEC UTL_FILE.PUT (ERREUR UTL_FILE.WRITE_ERROR)
    Par satanas dans le forum Oracle
    Réponses: 10
    Dernier message: 25/07/2005, 08h41

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