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.write_text : CLOB !


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 238
    Par défaut Utl_http.write_text : CLOB !
    Bonjour,

    j'ai petit soucis pour faire un "POST" avec un CLOB
    en fait tout est OK jusqu'à une certaine taille
    mais cela coince à un moment donné

    j'affiche la taille de mon clob avant d'exécuter la commante suivante
    -->p_data_in étant un clob
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    utl_http.write_text(l_http_req, p_data_in);
    et cette commande me renvoit un exception
    si le clob dépasse une certaine taille(voir plus bas):
    ORA-06502: PL/SQL: numeric or value error
    ORA-06502: PL/SQL: numeric or value error
    ORA-06503: PL/SQL: Function returned without value
    dans le set_header j'ai indiqué ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            utl_http.set_header(l_http_req, 'User-Agent', 'Mozilla/4.0');
            utl_http.set_header(l_http_req, 'content-type', 'text/xml');
            utl_http.set_header(l_http_req, 'content-length', length(p_data_in));
    j'ai su (+- ) trouver les tailles Max OK et la Min KO :

    cela passe pour une "lenght(P_data_in)" de 32761
    mais pas pour une "lenght(P_data_in)" de 32859

    REM : je sais que la taille maxi d'un RAW c'est 32767
    ça semble coller !!!!avec les chiffres ci-dessus
    mais pourtant je passe un CLOB et pas un RAW.....

    Sait-on envoyer ce clob en plusieurs parties ?
    dois-je utiliser une autre méthode ?

    Version oracle 8/9/10.

    voivi le code complet de la procedure HTTP_POST
    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
     
        function http_post
        (
             p_url_in in varchar2
            ,p_data_in in clob
            ,p_data_type in varchar2 default 'text/xml'
            ,p_proxy_in in varchar2 default null
            ,p_no_proxy_domains_in  in varchar2 default null
            ,p_username_in in varchar2 default null
            ,p_password_in in varchar2 default null
        )
        return varchar2 as
     
            l_http_req  utl_http.req;
            l_http_resp utl_http.resp;
            l_my_scheme varchar2(256);
            l_my_realm  varchar2(256);
            l_my_proxy  boolean;
            data  VARCHAR2(1024);
            my_context varchar2(4000):=null;
        my_db_trc_category varchar(100):='HTTP_TEST';
        begin
            -- When going through a firewall, pass requests through this host.
            -- Specify sites inside the firewall that don't need the proxy host.
    --        if (p_proxy_in is not null) and
    --            (p_no_proxy_domains_in is not null)
    --        then
    --            utl_http.set_proxy(p_proxy_in, p_no_proxy_domains_in);
    --        end if;
     
            -- Ask UTL_HTTP not to raise an exception for 4xx and 5xx status codes,
            -- rather than just returning the text of the error page.
            utl_http.set_response_error_check(false);
     
            -- Begin the post request
            l_http_req := utl_http.begin_request (p_url_in, 'POST');
            --l_http_req := utl_http.begin_request (p_url_in, 'GET');
            -- Set the HTTP request headers
            utl_http.set_header(l_http_req, 'User-Agent', 'Mozilla/4.0');
            utl_http.set_header(l_http_req, 'Transfer-Encoding','chunked');
            utl_http.set_header(l_http_req, 'content-type', p_data_type);
            utl_http.set_header(l_http_req, 'content-length', length(p_data_in));
     
     
            -- Specify a user ID and password for pages that require them.
       --     if p_username_in is not null then
       --       utl_http.set_authentication(
       --         l_http_req, p_username_in, p_password_in);
       --   end if;
     
            -- Write the data to the body of the HTTP request
     
           utl_http.write_text(l_http_req, p_data_in);
     
            -- Process the request and get the response.
            l_http_resp := utl_http.get_response (l_http_req);
            utl_http.read_text(l_http_resp, data);
            --
     
     
            -- Look for client-side error and report it.
            if (l_http_resp.status_code >= 400) and
               (l_http_resp.status_code <= 499)
            then
                -- Detect whether the page is password protected,
                -- and we didn't supply the right authorization.
                -- Note the use of utl_http.HTTP_UNAUTHORIZED, a predefined
                -- utl_http package global variable
                if (l_http_resp.status_code = utl_http.HTTP_UNAUTHORIZED) then
                    utl_http.get_authentication(
                        l_http_resp, l_my_scheme, l_my_realm, l_my_proxy);
                    if (l_my_proxy) then
                        dbms_output.put_line('Web proxy server is protected.');
                        dbms_output.put(
                            'Please supply the required ' ||
                            l_my_scheme ||
                            ' authentication username/password for realm ' ||
                            l_my_realm ||
                            ' for the proxy server.');
                    else
                        dbms_output.put_line(
                            'Web page ' || p_url_in || ' is protected.');
                        dbms_output.put(
                            'Please supplied the required ' ||
                            l_my_scheme ||
                            ' authentication username/password for realm ' ||
                            l_my_realm ||
                            ' for the Web page.');
                    end if;
                else
                    dbms_output.put_line('Check the URL.');
                end if;
                utl_http.end_response(l_http_resp);
        return(getTagContent(data,'contextId'));
     
            -- Look for server-side error and report it.
            elsif (l_http_resp.status_code >= 500) and
                    (l_http_resp.status_code <= 599)
            then
                dbms_output.put_line('Check if the Web site is up.');
                utl_http.end_response(l_http_resp);
        return(getTagContent(data,'contextId'));
            end if;
            utl_http.end_response (l_http_resp);
        return(getTagContent(data,'contextId'));
        exception
            when others then
                dbms_output.put_line (sqlerrm);
                raise;
        end;-- http_post;
    Merci
    pour votre aide

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Découpez votre CLOB en chunks de 32Ko que vous envoyez avec write_text() dans une boucle.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 238
    Par défaut
    j'ai trouvé une solution entre temps
    j'ai bien découpé le CLOB en morceaux de 30.00
    et j'ai fait une bloucle en utilisant la commande

    utl_http.write_line
    et par la suite...cela fonctionne aussi avec
    utl_http.write_text
    merci pour tout

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 238
    Par défaut
    Je croyais avoir trouvé la solution
    MAIS..

    je testais en oralce 10i :OK
    et maitenant an 11G :KO

    si j'ajoute cette commande suivante en 10i , tout se passe pour le mieux
    alors qu'en 11G j'ai une erreur(même si le clob passé en paramètre ne fait que quleque caractères!)

    commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    utl_http.set_header(l_http_req, 'Transfer-Encoding','chunked');
    erreur :
    ORA-29273: HTTP request failed
    ORA-06512: at "SYS.UTL_HTTP", line 1231
    ORA-12547: TNS:lost contact
    ORA-29273: HTTP request failed
    ORA-06512: at "SYS.UTL_HTTP", line 1231
    ORA-12547: TNS:lost contact
    declare
    *
    ERROR at line 1:
    ORA-06503: PL/SQL: Function returned without value
    ORA-06512: at "OF_OWNER.P_GVIEW", line 1126
    ORA-06512: at line 24
    donc si je retire cette ligne, je reviens au point de départ et je suis limité par ma taille !!!!!!!(=RAW c'est 32767 )

    N'y aurait-il pas un paramètre dans le header à ajouter ???


    Merci pour votre aide

  5. #5
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Essayez ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    utl_http.set_header(l_http_req, 'content-type', votre_CLOB);
    utl_http.set_header(l_http_req, 'content-length', length(votre_CLOB));

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 238
    Par défaut
    En fait,

    c'est ce que j'ai fait au tout début(voir debut de la discusion)
    mais ça bloque aussi pour des tailles > q'un RAW (32767)
    et c'est justement la base de mon problème

    donc, ce que nous avons fait(cette nuit!) pour contourner le problème
    je découpe mon clob en partie de 32767(maxi)
    et j'envoi un "HTTP_POST" par morceau
    (dans lequel j'indique bien les 2 lignes du HEADER[type/length du clob])
    et c'est la couche qui reçoit mes POST(pour un même contexte!)
    qui gère la récéption.

    REM : en non pas comme avant ou je découpais mon clob dans ma fonction "HTTP_POST" en partie de 32767(maxi)
    et j'envoyais un "WRITE_TEXT" par morceau et donc un seul HTTP_POST"

    Mais bon , cela ne me dit pas pourquoi cela ne fonctionne pas en 11 comme en 10i.soit

    ça à l'air de fonctionné jusqu'à présent
    merci

Discussions similaires

  1. Réponses: 17
    Dernier message: 07/10/2004, 18h05
  2. [CLOB] Détection caractère de fin
    Par SheikYerbouti dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 26/08/2004, 17h15
  3. [DB2] conversion BLOB -> CLOB
    Par Fabien Celaia dans le forum DB2
    Réponses: 12
    Dernier message: 12/07/2004, 12h09
  4. [CLOB]Installation spéciale???
    Par DEC dans le forum JDBC
    Réponses: 5
    Dernier message: 09/07/2004, 16h08
  5. Réponses: 12
    Dernier message: 27/08/2003, 11h04

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