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

Interfaces de programmation Oracle Discussion :

[OCILIB] Besoin d'éclaircissement


Sujet :

Interfaces de programmation Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2009
    Messages : 41
    Par défaut [OCILIB] Besoin d'éclaircissement
    Bonjour,

    Pour un besoin très particulier, j'ai besoin de deux fonctions :

    Une première qui prépare une requête et renvoie true/false si la requête a des enregistrements (ce besoin est obligatoire...)

    Une deuxième qui lit les enregistrements


    Le première utilise les instructions suivantes :

    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
     
    	st = OCI_StatementCreate(cn);
    	OCI_Prepare(st,"select * from toto where id_toto=:vtoto");
    	OCI_Execute(st);
    	rs = OCI_GetResultset(st);
    	if (OCI_FetchNext(rs))
    	{	
    		OCI_Execute(st);				
    		rs = OCI_GetResultset(st);		
     
     
    		return true;
    	}
    	else
    	{
    		return false
    	}
    La deuxième utilise les instructions suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	while (OCI_FetchNext(rs))
    		traitement des enregs

    Dans la première fonction, est-ce la meilleure méthode pour vérifier la présence d'enregs,
    sachant que la deuxième fonction doit renvoyer tous les enregs ?
    Est-ce que le statement aura un seul resultset associé à lui ?

    Est-ce qu'une requête de type "select count()" exécuter dans le première fonction serait plus optimale ?

    J'espère avoir été assez clair
    Fly.

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Salut,

    1 - faire un count() puis un select des champs est contre productif
    2 - une fois un fetch effectué, on ne peut revenir en arriere sauf si le curseur est bidirectionnel ce qui est aussi couteux
    3 - organiser le code pour ne faire ni 1 ni 2

    Voici un exmple qui propose 2 méthodes :

    1 -select puis fetch
    2 -select sur curseur bidirectionnel

    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
     
    #include "ocilib.h"
     
    void error_handler(OCI_Error *err);
     
    /* methode 1 */
     
    OCI_Statement * select_data1(OCI_Connection *cn, char *sql);
    void read_data1(OCI_Statement *st);
     
    /* methode 2 */
     
    OCI_Resultset * select_data2(OCI_Connection *cn, char *sql);
    void read_data2(OCI_Resultset *st);
     
    int main(void)
    {
        OCI_Connection *cn;
     
        if (!OCI_Initialize(error_handler, NULL, OCI_ENV_DEFAULT))
            return EXIT_FAILURE;
     
        cn = OCI_ConnectionCreate("db", "usr", "pwd", OCI_SESSION_DEFAULT);
     
        if (cn)
        {
            /* methode 1 */
     
            read_data1(select_data1(cn, "select 'method 1' from dual"));
     
     
            /* methode 2 */
     
            read_data2(select_data2(cn, "select 'method 2' from dual"));
     
     
            OCI_ConnectionFree(cn);
        }
     
        OCI_Cleanup();
     
        return EXIT_SUCCESS;
    }
     
     
    void error_handler(OCI_Error *err)
    {
        int         err_type = OCI_ErrorGetType(err);
        const char *err_msg  = OCI_ErrorGetString(err);
     
        printf("** %s - %s\n", err_type == OCI_ERR_WARNING ? "Warning" : "Error", err_msg);
    }
     
    OCI_Statement * select_data1(OCI_Connection *cn, char *sql)
    {
        OCI_Statement *st = NULL;
     
        st = OCI_StatementCreate(cn);
     
        if (OCI_ExecuteStmt(st, sql) == FALSE)
        {
            OCI_StatementFree(st);
            st = NULL;
        }
     
        return st;
    }
     
     
    void read_data1(OCI_Statement *st)
    {
        if (st)
        {
            OCI_Resultset *rs = OCI_GetResultset(st);
     
            while (OCI_FetchNext(rs))
            {
                printf("%s\n", OCI_GetString(rs, 1));
            }
     
            OCI_StatementFree(st);
       }
    }
     
    OCI_Resultset * select_data2(OCI_Connection *cn, char *sql)
    {
        OCI_Statement *st = NULL;
        OCI_Resultset *rs = NULL;
     
        st = OCI_StatementCreate(cn);
     
        OCI_SetFetchMode(st, OCI_SFM_SCROLLABLE);
     
        if (OCI_ExecuteStmt(st, sql) == FALSE)
        {
            OCI_StatementFree(st);
            st = NULL;
        }
        else
        {
            rs = OCI_GetResultset(st);
     
            if (OCI_FetchNext(rs) == FALSE)
            {
                OCI_StatementFree(st);
                st = NULL;
                rs = NULL;
            }
        }
     
        return rs;
    }
     
     
    void read_data2(OCI_Resultset *rs)
    {
        if (rs)
        {
            printf("%s\n", OCI_GetString(rs, 1));
     
            while (OCI_FetchNext(rs))
            {
                printf("%s\n", OCI_GetString(rs, 1));
            }
     
            OCI_StatementFree(OCI_ResultsetGetStatement(rs));
       }
    }
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

Discussions similaires

  1. [POO] Besoin d'éclaircissements.
    Par Faiche dans le forum Langage
    Réponses: 13
    Dernier message: 10/12/2007, 11h38
  2. Pointeur structure : besoin d'éclaircissements
    Par julien.63 dans le forum C
    Réponses: 4
    Dernier message: 28/04/2007, 00h26
  3. Réponses: 2
    Dernier message: 08/12/2006, 23h32
  4. [vb6] traitement d'images, besoin d'éclaircissements
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 01/08/2006, 10h20
  5. [JGoodies] besoin d'éclaircissements
    Par sozie9372 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 26/06/2006, 23h10

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