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

Administration Oracle Discussion :

Problème d'écriture de fichier sous Oracle


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Par défaut Problème d'écriture de fichier sous Oracle
    Bonjour,

    J'ai un PL/SQL qui doit écrire un fichier sous Unix or quand on le lance on obtient le message d'erreur suivant :
    ancien 91 : NomRepertoire := '&&1';
    nouveau 91 : NomRepertoire := '/rtpg01/aneto/ceur00/batch/output';
    ancien 95 : NomFichier := '&&2';
    nouveau 95 : NomFichier := 'REMUNPS_RECUES_27012009_27012009.dat';
    ancien 113 : DateTemp:= '&&3';
    nouveau 113 : DateTemp:= '27012009';
    ancien 115 : DateTemp:= '&&4';
    nouveau 115 : DateTemp:= '27012009';
    declare
    *
    ERREUR à la ligne 1 :
    ORA-20100: erreur dans la reprise des données rémun. PS
    ORA-06512: à ligne 147
    ORA-20000: erreur dans l'ouverture du fichier
    /rtpg01/aneto/ceur00/batch/output/REMUNPS_RECUES_27012009_27012009.dat
    ORA-29280: chemin de répertoire non valide
    On a créé sous Oracle la directory et les grant :
    DROP DIRECTORY OUT_DIR;
    CREATE OR REPLACE DIRECTORY
    OUT_DIR AS '/rtpg01/aneto/tst00/batch/output';
    GRANT READ, WRITE ON DIRECTORY SYS.OUT_DIR TO TST00_USER;
    GRANT READ, WRITE ON DIRECTORY SYS.OUT_DIR TO PUBLIC;
    Le répertoire a été créé sous Unix avec les droits en 777.

    Quelqu'un a-t-il une idée car je sèche ?


    Mon PL/SQL si ça peut aider à l'analyse :
    -- Paramétrage de la session
    WHENEVER SQLERROR EXIT 9;
    WHENEVER OSERROR EXIT 10;
    SET SERVEROUTPUT ON;
    SET TIMING OFF;

    ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';

    declare

    -- Déclaration type de l'entête
    TYPE rec_entete IS RECORD (
    ent_typenr char(1),
    ent_idftrt number(9),
    ent_typtrt char(1),
    ent_fin varchar2(84)
    );

    -- Déclaration type du détail
    TYPE rec_detail IS RECORD (
    det_typenr char(1),
    det_codnme char(4),
    det_codsnm char(2),
    det_numpsa char(9),
    det_amcdet char(10),
    det_numoct char(14),
    det_typcpt char(1),
    det_datrcp char(8),
    det_datpai char(8),
    det_grpamc char(2),
    det_numamc char(10),
    det_numfac char(9),
    det_datfac char(8),
    det_dattrt char(8),
    det_indele char(1)
    );

    -- Déclaration du curseur
    cursor cur_xfnpayes (pDatedeb date,pDatefin date) is
    SELECT '2',xfnpcodnme,xfnpcodsnm,xfnpnumpsa,decode(xfnpamcdet,null,' ',xfnpamcdet),
    xfnpnumoct,'T',to_char(xfnpdatrcp,'YYYYMMDD'),' ',xfamgrpamc,xfnpnumamc,xfnpnumfac,
    to_char(xfnpdatfac,'YYYYMMDD'),to_char(xfnpdattrt,'YYYYMMDD'),xfnpindele
    from xfnpayes, xfamcomp
    where xfnpauddcr between to_date(pDatedeb,'DD/MM/YYYY HH24:MI:SS')
    and to_date(pDatefin,'DD/MM/YYYY HH24:MI:SS')
    and xfnpnumamc=xfamnumamc and xfnpcodnme=xfamcodnme and xfnpcodsnm=xfamcodsnm;

    -- Déclaration des variables
    lig_entete rec_entete;
    lig_detail rec_detail;
    WS_LIGNE CHAR(95);
    WS_FILEHANDLE UTL_FILE.FILE_TYPE;
    NomRepertoire VARCHAR2(150);
    NomFichier VARCHAR2(150);
    DateDeb VARCHAR2(20);
    DateFin VARCHAR2(20);
    DateTemp VARCHAR2(08);

    -- GESTION DES EXCEPTIONS
    FILE_NOT_FOUND EXCEPTION;
    UTL_FILE_DIR_NOT_SET EXCEPTION;
    PRAGMA EXCEPTION_INIT(FILE_NOT_FOUND, -1309);
    PRAGMA EXCEPTION_INIT(UTL_FILE_DIR_NOT_SET, -1308);

    PROCEDURE ECRIRE_ENTETE(WS_FILE_HANDLE UTL_FILE.FILE_TYPE) IS
    BEGIN
    lig_entete.ent_typenr := '1';
    lig_entete.ent_idftrt := 999999999;
    lig_entete.ent_typtrt := 'P';
    -- ECRITURE DE L'ENTETE
    WS_LIGNE := lig_entete.ent_typenr||lig_entete.ent_idftrt||lig_entete.ent_typtrt;

    -- ECRITURE DANS LE FICHIER
    UTL_FILE.PUT_LINE( WS_FILE_HANDLE, WS_LIGNE );
    UTL_FILE.FFLUSH(WS_FILE_HANDLE);
    DBMS_OUTPUT.PUT_LINE(WS_LIGNE) ;
    END;

    PROCEDURE ECRIRE_LIGNE(WS_FILE_HANDLE UTL_FILE.FILE_TYPE) IS
    BEGIN

    -- ECRITURE DE L'ENREGISTREMENT
    WS_LIGNE := lig_detail.det_typenr||lig_detail.det_codnme||
    lig_detail.det_codsnm||lig_detail.det_numpsa||lig_detail.det_amcdet||
    lig_detail.det_numoct||lig_detail.det_typcpt||lig_detail.det_datrcp||
    lig_detail.det_datpai||lig_detail.det_grpamc||lig_detail.det_numamc||
    lig_detail.det_numfac||lig_detail.det_datfac||lig_detail.det_dattrt||
    lig_detail.det_indele;

    -- ECRITURE DANS LE FICHIER
    UTL_FILE.PUT_LINE( WS_FILE_HANDLE, WS_LIGNE );
    UTL_FILE.FFLUSH(WS_FILE_HANDLE);
    --DBMS_OUTPUT.PUT_LINE(WS_LIGNE) ;
    END;

    begin

    -- Repertoire dans lequel est stocke le fichier
    NomRepertoire := '&&1';


    -- Nom du fichier
    NomFichier := '&&2';


    -- OUVERTURE DU FICHIER
    --**********************
    BEGIN
    WS_FILEHANDLE := UTL_FILE.FOPEN (NomRepertoire, NomFichier,'w');

    EXCEPTION
    WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20000, 'erreur dans l''ouverture du fichier '||NomRepertoire||'\'||NomFichier , TRUE);
    END;

    -- Ecriture de l'entête du fichier listant les incoherences et dans le fichier de log
    --************************************************************************************
    ECRIRE_ENTETE(WS_FILEHANDLE);

    -- ouverture du curseurr
    DateTemp:= '&&3';
    DateDeb := SUBSTR(DateTemp,1,2)||'/'||SUBSTR(DateTemp,3,2)||'/'||SUBSTR(DateTemp,5,4)||' 00:00:00';
    DateTemp:= '&&4';
    DateFin := SUBSTR(DateTemp,1,2)||'/'||SUBSTR(DateTemp,3,2)||'/'||SUBSTR(DateTemp,5,4)||' 23:59:59';
    open cur_xfnpayes (DateDeb,DateFin);

    -- Boucle de lecture
    loop
    -- Sortie de la boucle si plus d'enreg
    exit when cur_xfnpayes%notfound;

    fetch cur_xfnpayes into lig_detail.det_typenr,lig_detail.det_codnme,
    lig_detail.det_codsnm,lig_detail.det_numpsa,lig_detail.det_amcdet,
    lig_detail.det_numoct,lig_detail.det_typcpt,lig_detail.det_datrcp,
    lig_detail.det_datpai,lig_detail.det_grpamc,lig_detail.det_numamc,
    lig_detail.det_numfac,lig_detail.det_datfac,lig_detail.det_dattrt,
    lig_detail.det_indele;

    ECRIRE_LIGNE(WS_FILEHANDLE);

    --dbms_output.put_line(lig_detail.det_typenr||lig_detail.det_codnme||
    -- lig_detail.det_codsnm||lig_detail.det_numpsa||lig_detail.det_amcdet||
    -- lig_detail.det_numoct||lig_detail.det_typcpt||lig_detail.det_datrcp||
    -- lig_detail.det_datpai||lig_detail.det_grpamc||lig_detail.det_numamc||
    -- lig_detail.det_numfac||lig_detail.det_datfac||lig_detail.det_dattrt||
    -- lig_detail.det_indele);

    end loop;

    -- fermeture du curseur
    close cur_xfnpayes;

    EXCEPTION
    WHEN others THEN
    RAISE_APPLICATION_ERROR(-20100, 'erreur dans la reprise des données rémun. PS' , TRUE);

    end;
    /

    EXIT;

  2. #2
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    Bonjour,

    tu lances ton pl/sql dans sqlplus ?

    si oui, essai de mettre un seul & pour tes variables.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    -- Repertoire dans lequel est stocke le fichier
    NomRepertoire := '&1';

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Par défaut
    Mon PL/SQl est lancé par un shell avec la commande sqlplus :
    sqlplus -s TST00_USER/TST00_USER@INSTANCEORACLE @RemunPS_Recues.sql /rtpg01/aneto/ceur00/batch/output REMUNPS_RECUES_27012009_27012009.dat 27012009 27012009

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Par défaut
    En mettant '&1' à la place de '&&1', le problème persiste...

  5. #5
    Membre éprouvé Avatar de laurentleturgez
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 88
    Par défaut
    Bonjour,

    Que te répond la commande ls du fichier exécutée avec l'utilisateur Oracle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ls -l /rtpg01/aneto/ceur00/batch/output/REMUNPS_RECUES_27012009_27012009.dat
    Il est probable que l'utilisateur oracle ne dispose pas de tous les droits sur une branche située plus haute (ex : /rtpg01/aneto)

    Laurent

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/12/2006, 17h06
  2. Problème de récupération de fichier sous Windows98
    Par ero-sennin dans le forum Delphi
    Réponses: 4
    Dernier message: 14/12/2006, 13h14
  3. Réponses: 5
    Dernier message: 04/12/2006, 17h40
  4. Problème avec la commande revoke sous oracle
    Par merlubreizh dans le forum Oracle
    Réponses: 19
    Dernier message: 28/04/2006, 15h02
  5. Réponses: 11
    Dernier message: 30/12/2005, 12h33

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