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

Oracle Discussion :

[Pl/Sql] blob et une procédure stockée


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut [Pl/Sql] blob et une procédure stockée
    Bonjour,

    Sujet également posté sur le forum PHP mais resté sans réponses :

    http://www.developpez.net/forums/viewtopic.php?t=469424

    Je cherche à insérer un blob dans une base Oracle en passant par une procédure stockée
    PROCEDURE :
    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
    CREATE OR REPLACE PROCEDURE Insert_Blob (
       pChamp1 IN maTable.CHAMP_TEXTE1%TYPE,
       pBlob IN maTable.CHAMP_BLOB%TYPE)
    AS
     
    lob_loc BLOB;
    amount BINARY_INTEGER;
    id INTEGER;
     
    BEGIN
     
        SELECT  dbms_lob.GETLENGTH(pBlob) INTO amount FROM dual ;
     
        SELECT  maTable_SEQ.NEXTVAL INTO id FROM dual ;
     
        INSERT INTO maTable
              (ID, CHAMP_TEXTE1, CHAMP_BLOB)
        VALUES
             (id, pChamp1,            EMPTY_BLOB())
        RETURNING CHAMP_BLOB INTO lob_loc;
     
        dbms_lob.WRITE (lob_loc, amount, 0, pBlob);
     
    END Insert_Blob;
    /
    Appel PHP :
    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
    /*
     * Ouverture du fichier binaire à stocker dans la table
     */
    if (!$handle = fopen('image.jpg','rb')) return 0;
    $contenu_fichier = fread($handle, filesize ('image.jpg'));
    fclose($handle);
     
    /*
     * Clé, type, valeurs à insérer dans la table
     */
    $arrVals[0]['key'] = ':pChamp1';
    $arrVals[0]['type'] = 'DEFAUT';
    $arrVals[0]['valeur'] = 'du texte';
     
    $arrVals[1]['key'] = ':pBlob';
    $arrVals[1]['type'] = 'BLOB';
    $arrVals[1]['valeur'] = $contenu_fichier;
     
    /*
     * Insertion dans la table
     */
    $stmt = OCIParse($connexion, 'BEGIN INSERT_BLOB(:pChamp1, :pBlob);END;');
    $cpt = count($arrVals);
    for($i=0; $i<$cpt; $i++) {
        //CAS D'un BLOB
        if ($arrVals[$i]["type"]== 'BLOB') {
            ${'BLOB'.$i} = OCINewDescriptor($connexion,OCI_D_LOB);
            OCIBindByName($stmt, $arrVals[$i]["key"],${'BLOB'.$i}, -1, OCI_B_BLOB);
            ${'BLOB'.$i}->WriteTemporary($arrVals[$i]["valeur"], OCI_TEMP_BLOB);
        }
        // Cas par défaut
        else if ($arrVals[$i]["type"]== 'DEFAUT') {
            OCIBindByName($stmt, $arrVals[$i]["key"], $arrVals[$i]["valeur"]);
        }
    }
    $r = OCIExecute($stmt, OCI_DEFAULT);
    OCICommit($this->ptConnexion);
    ocifreestatement($stmt);
    for($i=0; $i<$cpt; $i++) {
        if ($arrVals[$i]["type"]== 'BLOB') {
            ${'BLOB'.$i}->close();
            ${'BLOB'.$i}->free();
        }
    }
    Je récupére une erreur au moment de l'exécution de la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PHP Warning: OCIStmtExecute: ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments
    C'est quoi qui ne va pas dans ma méthode : (Je travaille en PHP 4.2.3) Question

    Merci d'avance !

  2. #2
    j6m
    j6m est déconnecté
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Par défaut
    oui c'est une erreur oracle, donc c'est l'appel à la procèdure qui râle à la première ligne ; on dirait que vous passez un BLOB et que vous voulez récupérer un CLOB?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut
    Bonjour, désolé de ma réponse si tardive, mais we oblige ... :-)

    Je passe bien un blob, car j'arrive à inserer le fichier sans passer par une procédure stockée (dans ce cas le php est légerement différent).

    De même en changant le code de la procédure, j'arrive sans problème à inserer un Clob (je fais directement l'insert, sans aucun autre traitement).

  4. #4
    j6m
    j6m est déconnecté
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Par défaut
    donc pour lui passer un blob, le php est légèrement différent? Mais c'est un blob qu'attend la procédure Oracle non?
    et ça serait cohérent avec ton message d'erreur

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut
    Après vérification du php, j'ai réussi à supprimer l'erreur ORA-06550. Maintenant, je suis sur que seule la procédure pose problème. En effet, si je crée une procédure qui se contente de renvoyer la taille du blob que je lui passe, la taille renvoyée est exactement la bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE PROCEDURE Taille_Blob ( 
              pBlob IN maTable.CHAMP_BLOB%TYPE,
              test out integer) 
    AS 
    BEGIN 
        test := dbms_lob.GETLENGTH(pBlob);
        END Taille_Blob; 
    /
    Mais si je modifie de nouveau la procédure (mais pas le php) pour tenter l'insertion :
    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
    CREATE OR REPLACE PROCEDURE Insert_Blob (    pBlob IN maTable.CHAMP_BLOB%TYPE,test out integer) 
    AS 
     
    lob_loc BLOB; 
    amount BINARY_INTEGER; 
    id INTEGER; 
     
    BEGIN 
     
        SELECT  dbms_lob.GETLENGTH(pBlob) INTO amount FROM dual ; 
     
        SELECT  maTable_SEQ.NEXTVAL INTO id FROM dual ; 
     
        INSERT INTO maTable 
              (ID, CHAMP_BLOB) 
        VALUES 
             (id,   EMPTY_BLOB()) 
        RETURNING CHAMP_BLOB INTO lob_loc; 
     
        dbms_lob.WRITE (lob_loc, amount, 1, pBlob); 
     
    END Insert_Blob; 
    /
    alors mon message d'erreur est maintenant le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-22921: length of input buffer is smaller than amount requested
    J'essaie d'augmenter ou diminuer la taille de l'espace reservé pour le blob, rien ne fonctionne. Je ne compren toujours pas ce qui se passe ...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Par défaut
    Pour info et pour ceux que ça intéresse, j'ai résolu mon problème de la façon suivante :

    - je code mon fichier binaire en base 64
    - je le stocke dans un CLOB à l'aide d'une procédure qui réalise une insertion simple
    - je le décode et je peux relire intégralement mon fichier!

    Bien sur je perd en performances et en espace de stockage, mais vu que je suis obligé de passer par une procédure stockée, je n'ai pas trop le choix...

    A moins que quelqu'un connaisse la solution permettant d'inserer un BLOB.

    A bientot !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/09/2008, 17h25
  2. [Transact-SQL] Optimisation d'une procédure stockée
    Par Shinn77 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 25/06/2007, 12h30
  3. [SQL] Comment faire une procédure stockée
    Par PoichOU dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 28/05/2007, 21h58
  4. SQL dynamique dans une procédure stockée
    Par Amnesiak dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/07/2005, 15h17
  5. Appel d'un script SQL dans une procdure stockée
    Par doudou10000 dans le forum Oracle
    Réponses: 10
    Dernier message: 01/12/2004, 10h01

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