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 :

UTL_HTTP ORA-12547: TNS : contact perdu


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut UTL_HTTP ORA-12547: TNS : contact perdu
    Bonjour,

    En tentant d'envoyer un gros fichier xml (environ 1 mo) via UTL_HTTP.getresponse(laRequete)
    J'obtiens l'erreur suivante :

    "Erreur dans Envoyer_KML
    ORA-29273: échec de demande HTTP
    ORA-06512: à "SYS.UTL_HTTP", ligne 1231
    ORA-12547: TNS : contact perdu"

    La premiere chose que je ne comprends pas c'est comment lire l'erreur.
    Je pensais que
    ORA-29273: échec de demande HTTP est due à
    ORA-06512: à "SYS.UTL_HTTP", ligne 1231 est due à
    ORA-12547: TNS : contact perdu"

    en clair je crois que c'est l'erreur contact perdu qui entraine les autres.
    C'est bien ça?

    J'ai pensé à des pbm de pare feu mais sur le serveur de base de données j'arrive à afficher la page du serveur distant. mais il a fallu changer la conf du proxy sous IE. je ne sais pas s'il faut rebooter quelque chose?
    J'arrive à faire un TNSPING sur le serveur. le TNSNAME.ORA est bon.
    Je n'ai pas de variable ORACLE_HOME ni de variable ORACLE SID
    Je suis sous windows 2003 Server enterprise edition. oracle 10Gr2.

    Deuxieme question : avez vous des idées pour corriger le souci?




    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
     
    -- 
    -- Envoi d'un KML dans l'extranet via POST
    -- 
    PROCEDURE Envoyer_KML
    	( pNomFic		 VARCHAR2
        )
    IS
      vContenu       	VARCHAR2(4000); --contiendra le debut du contenu le content de la requete HTTP
      vPostText     	CLOB;
      vRequest      	UTL_HTTP.REQ;
      vResponse     	UTL_HTTP.RESP;
      vResponseText 	VARCHAR2(4000);
      vErrorText    	VARCHAR2(2000);
      vReponseWsOk      VARCHAR2(7) 	:='{"Id":%';
     
      vContentLenght   integer:=0;     --contiendra la taille de la requete HTTP
     
      vLeBfile			BFILE;
      vLen 				NUMBER := dbms_lob.lobmaxsize;
      vNum 				NUMBER ;
      vSrc_off 			PLS_INTEGER := 1 ;
      vDst_off 			PLS_INTEGER := 1 ;
      vLangctx 			NUMBER := dbms_lob.default_lang_ctx ;
      vWarn 			NUMBER;
     
      nStart 			NUMBER := 1;
      nEnd 				NUMBER := 32001;
      nClobLength 		NUMBER;
      vChunkData 		VARCHAR2(32000);
      nLength 			NUMBER := 32000;
     
      vFrontiere 		VARCHAR2(60) := 'UGm9bi3xfU1DeaauuXkZ22BYwyISyuvOvo';
     
      vTimeStamp		VARCHAR2(20)	:='';
      vSignature		VARCHAR2(40)	:='';
     
    BEGIN
     
    	vTimeStamp	:=TO_CHAR(CURRENT_TIMESTAMP, FORMAT_TIMESTAMP_HACHAGE);
    	vSignature	:=lower(RAWTOHEX(champCrypte(CLE_SECRETE,vTimeStamp)));
     
    	--*****************************************
    	--lecture du fichier dans un clob
    	--*****************************************
     
    	--creation du fichier temporaire
    	dbms_lob.createtemporary( vPostText, TRUE ) ;
     
    	--initialisation du clob au debut de la requete
    	vContenu :=             '--' || vFrontiere || CHR(13) || CHR(10) || 'content-disposition: form-data; name="directoryId"' || CHR(13) || CHR(10);
    	vContenu := vContenu || 'Content-Type: text/plain; charset=UTF-8' || CHR(13) || CHR(10);
    	vContenu := vContenu || 'Content-Transfer-Encoding: 8bit'  || CHR(13) || CHR(10)  || CHR(13) || CHR(10);
    	vContenu := vContenu || '2' || CHR(13) || CHR(10);
    	vContenu := vContenu || '--' || vFrontiere || CHR(13) || CHR(10) || 'content-disposition: form-data; name="8"; filename="' || pNomFic || '"' || CHR(13) || CHR(10) ;
    	vContenu := vContenu || 'Content-Type: application/octet-stream' || CHR(13) || CHR(10) ;
    	vContenu := vContenu || 'Content-Transfer-Encoding: binary';
    	vContenu := vContenu || CHR(13) || CHR(10) || CHR(13) || CHR(10); --le deuxieme retour chariot et line feed est important : fo pas le retirer.
    	dbms_lob.write(vPostText, LENGTH(vContenu), 1, vContenu);
     
      Tracage('Envoyer_KML','init CLOB effectue');
     
    	--ouverture du fichier
    	vLeBfile := BFILENAME('KML_FILES', pNomFic );
     	dbms_lob.fileopen(vLeBfile, dbms_lob.file_readonly);
     
      Tracage('Envoyer_KML','ouverture du fichier effectue');
     
    	--reglage du debut de la destination à la fin du CLOB
    	vDst_off := LENGTH(vContenu)+1;
     
    	DBMS_LOB.LOADCLOBFROMFILE (
    		vPostText,              -- CLOB de destination
            vLeBfile,               -- Pointeur fichier en entrée
            vLen,                	-- Nombre d'octets à lire
            vDst_off,               -- Position destination de départ
            vSrc_off,            	-- Position source de départ
            dbms_lob.default_csid,  -- CSID
            vLangctx,            	-- Contexte langue
            vWarn);              	-- Message d'avertissement
    	dbms_lob.fileclose(vLeBfile);
     
    	--écriture de la derniere frontiere (fin du fichier) fo pas retirer le premier retour chariot / line feed
    	dbms_lob.writeappend(vPostText, length(vFrontiere)+8,CHR(13) || CHR(10) || '--' || vFrontiere || '--' || CHR(13) || CHR(10));
     
        Tracage('Envoyer_KML','LOADCLOBFROMFILE effectue');
     
    	--*****************************************
    	--envoi du fichier 
    	--*****************************************
     
    	--création de l'objet requête
    	vRequest := UTL_HTTP.BEGIN_REQUEST
            ( url 			=> ADRESSE_WS_KML  
            , METHOD 		=> 'POST'
            , http_version	=> 'HTTP/1.1'
            );
     
    	--réglage de la requete au format UTF-8
    	UTL_HTTP.SET_BODY_CHARSET
    		(r 			=> vRequest
    	    ,charset 	=> CHARSET_EMISSION);
     
    	--le header timestamp
    	UTL_HTTP.SET_HEADER
          ( r     => vRequest
          , NAME  => 'Lutece Request Timestamp'
          , VALUE => vTimeStamp
          );
     
    	--le header signature
        UTL_HTTP.SET_HEADER
          ( r     => vRequest
          , NAME  => 'Lutece Request Signature'
          , VALUE => vSignature
          );
     
    	--le header Content-Type
    	UTL_HTTP.SET_HEADER
    		( r     => vRequest
    		, NAME  => 'Content-Type'
    		, VALUE => 'multipart/form-data; boundary=' || vFrontiere
    		);
     
    	--le header Content-Length
        UTL_HTTP.SET_HEADER
    		( r     => vRequest
    	 	, NAME  => 'Content-Length'
    	    , VALUE => (dbms_lob.getLength(vPostText)+2)
    		);
     
    	nClobLength := dbms_lob.getLength(vPostText);
     
        Tracage('Envoyer_KML','preparation envoi  effectue');
     
    	--
    	--ecrire le corps de la requete en faisant une boucle 
    	--
    	--UTL_HTTP.WRITE_TEXT (vRequest, vContenu);
    	LOOP
    		if nEnd > nClobLength then
    		  nEnd := nClobLength;
    		  nLength := nEnd - nStart+1;
    		end if;
    		--DBMS_OUTPUT.PUT_LINE ('nEnd:' || nEnd || ' nClobLength:' || nClobLength || ' nLength:' || nLength);
    		vChunkData := null;
    		vChunkData := DBMS_LOB.SUBSTR(vPostText, nLength, nStart);
    		UTL_HTTP.WRITE_TEXT ( vRequest, vChunkData );
    		--DBMS_OUTPUT.PUT_LINE ( vChunkData || 'coucouFGcoucou' );
    		if nEnd = nClobLength then
    		  exit;
    		end if;
    		nStart := nEnd;
    		nEnd := nStart + 32000;
    	END LOOP;
     
        Tracage('Envoyer_KML','boucle write text effectue');
     
    	--réglage du timeout de la requete à 512
    	utl_http.set_transfer_timeout(vRequest,512);
    	--envoi de la requete et récupération de la réponse
        Tracage('Envoyer_KML','avant getResponse');
    	vResponse := UTL_HTTP.GET_RESPONSE(vRequest);
        Tracage('Envoyer_KML','apres getResponse');
    	--*************************************************************
    	--analyse de la réponse
    	--*************************************************************
    	IF vResponse.status_code = STATUS_OK THEN
    		--reponse = OK 
    		UTL_HTTP.SET_BODY_CHARSET
    			(r 			=> vResponse
    			,charset 	=> CHARSET_RECEPTION);
    		--lire la réponse
    		UTL_HTTP.READ_TEXT(vResponse, vResponseText);
    		--si reponse NOK mettre son contenu dans la variable d'erreur
    		IF vResponseText NOT LIKE vReponseWsOk THEN
    			vErrorText := vResponseText;
    		END IF;
        ELSE --reponse = NOK
    		--mettre le code et la raison dans la variable d'erreur
    		vErrorText := 'status:'||vResponse.status_code||' reason:'||vResponse.reason_phrase;
        END IF;
        --fermer la réponse libérer les CLOB
        UTL_HTTP.END_RESPONSE(vResponse);
        dbms_lob.freetemporary(vPostText);
     
        --si la variable d'erreur n'est pas vide : journaliser et envoyer un mail
        IF vErrorText IS NOT NULL THEN
    		--je ne lève pas une ereur pour ne pas bloquer tout, j'envoie juste un mail
    		LOG_ET_ENVOI_MAIL_ERREUR(-1, '', 'Erreur dans la procédure de création du fichier KML : '||' '||vErrorText, 'PKG_EXTRANET_DES_CONSIGNATIONS-Envoyer_KML');
        END IF;
     
    	EXCEPTION
    		WHEN OTHERS THEN
    		LOG_ET_ENVOI_MAIL_ERREUR(SQLCODE, SQLERRM, 'Erreur dans Envoyer_KML','PKG_EXTRANET_DES_CONSIGNATIONS.Envoyer_KML');
     
    END Envoyer_KML;
    TRACES :
    Succès de l'élément pkg_extranet_des_consignations.envoyer_kml 'BR+CONSIGNATION.KML').
    [Envoyer_KML] init CLOB effectue
    [Envoyer_KML] ouverture du fichier effectue
    [Envoyer_KML] LOADCLOBFROMFILE effectue
    [Envoyer_KML] preparation envoi effectue
    [Envoyer_KML] boucle write text effectue
    [Envoyer_KML] avant getResponse

    Je ne pense pas que le souci soit dans le code : je crois que c'est un paramètre réseau ou de base de données.
    Avez vous des suggestions?
    D'avance Merci, Franck

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Vérifiez que vous indiquez le Transfer-Encoding de type chunked. J'avais récemment utilisé un algorithme comme ci dessous:
    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
     
    ...
      l_http_request := UTL_HTTP.begin_request(url, 'POST', UTL_HTTP.HTTP_VERSION_1_1);  
      UTL_HTTP.set_header(l_http_request, 'Content-Type', 'application/pdf');
      UTL_HTTP.set_header(l_http_request, 'Transfer-Encoding', 'chunked');
      UTL_HTTP.set_header(l_http_request, 'Content-Length', dbms_lob.getlength(l_envreq));  
      UTL_HTTP.set_header(l_http_request, 'SOAPAction', url);
      While l_pos < dbms_lob.getlength(l_envreq)
      Loop
         DBMS_LOB.read(l_envreq, l_amount, l_pos, l_buffer);
         UTL_HTTP.write_text(l_http_request, l_buffer);  
         --
         l_pos := l_pos + l_amount;
      End Loop;
      -- response
      l_http_response := UTL_HTTP.get_response(l_http_request);
      UTL_HTTP.read_text(l_http_response, l_envelope, 32767);
    --  l_xmltype_out := SYS.XMLTYPE(l_envelope);
      UTL_HTTP.end_response(l_http_response);
      --
      Return(l_envelope);
     
    ...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut [10gR2] UTL_HTTP ORA-12547: TNS : contact perdu (BOM et I trema)
    Bonjour, (Désolé pour la réponse tardive )

    Merci de votre réponse cela m'a aidé à avancer.

    effectivement quand on met Transfer-Encoding', 'chunked
    Les traces vont plus loin.
    Mais le fichier ne passe pas non plus : le serveur répond 204 no content.
    J'ai déjà eu cette erreur 204 et c'était du à des caractères accentués.

    Donc j'ai investigué un peu plus avec de nouvelles informations :
    Le serveur de production fonctionne.
    Les serveurs de recettes ne fonctionnent pas.

    Je me suis aperçu que le fichier était généré sans BOM (Binary Order Mark)
    Je me suis aperçu que si j'ajoutais le BOM le fichier passe alors dans le réseau
    Je me suis aperçu que si le fichier contenait un caractère ï (i tréma) alors le fichier passe aussi dans le réseau.

    C'est difficile pour moi d'ajouter automatiquement le BOM (il faudrait que je génère le fichier .kml avec une nouvelle version d'ogr2ogr avec toute l'installation que cela suppose)
    Je ne comprends pas pourquoi un simple ï permet au fichier d'être transféré dans le réseau et surtout que son absence empêche son transfert.

    Est ce que quelqu'un a une explication?

    D'avance merci, Franck

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Je pense que vous avez un problème d'encodage des caractères.

Discussions similaires

  1. [11g] Connexion sysdba : ORA-12547: TNS:lost contact
    Par Sable12 dans le forum Connexions aux bases de données
    Réponses: 5
    Dernier message: 13/11/2014, 10h06
  2. ORA-03135: contact perdu pour la connexion
    Par BabouOne dans le forum Administration
    Réponses: 0
    Dernier message: 27/03/2014, 12h50
  3. ORA-12547: TNS:lost contact
    Par knulp dans le forum Administration
    Réponses: 4
    Dernier message: 02/12/2009, 16h58
  4. TNS-12547 TNS:lost contact
    Par elharet dans le forum Administration
    Réponses: 0
    Dernier message: 16/10/2008, 13h23
  5. ORA-12547: TNS:lost contact
    Par Eric BERNARD dans le forum Oracle
    Réponses: 14
    Dernier message: 08/09/2006, 09h05

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