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 :

[PRO*C] tableau


Sujet :

Interfaces de programmation Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Par défaut [PRO*C] tableau
    Amis programmeurs Bonjour,

    Actuellement étudiant en DUT Informatique, je suis actuellement confronté à un problème qui concerne Oracle et plus spécifiquement au PRO-C (j'espère que je suis bien dans la bonne section ),

    Le but de ma fonction est de permettre à l'utilisateur à travers une interface console de faire une recherche sur une table (avec entre autres, un titre). Voici le code:

    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
    void recherche_titre()
    {	
    	
    	EXEC SQL begin DECLARE section;
    	
    	char sql_tableau[100];
    	char sql_resul[250];
    	
    	EXEC SQL end DECLARE section;
    	
    	printf("Entrez le titre du sujet\n");
    	fgets(sql_tableau, 100, stdin);
    	
    	EXEC SQL DECLARE requete CURSOR FOR SELECT TITRE FROM SUJET WHERE TITRE LIKE :sql_tableau;
    	
    	EXEC SQL OPEN requete;
    	
    	EXEC SQL FETCH requete INTO :sql_resul;
    	
    	while((sqlca.sqlcode >= 0) && (sqlca.sqlcode != 1403))
    	{
    		printf("%s\n", sql_resul);
    		EXEC SQL FETCH requete INTO :sql_resul;
    	}
    	
    
    	
    	EXEC SQL CLOSE requete;
    }
    Mon problème est le suivant lorsque l'utilisateur rentre le titre du sujet qu'il souhaite consulter il est stocké dans un tableau de char qui ici s'appelle sql_tableau (merci le C pour la gestion des string :S), la requête renvoie un ensemble de résultats et c'est pour cela si j'ai bien compris que je dois utiliser un curseur pour les stocker. L'ensemble de ses résultat est stocké dans un tableau sql_resul.

    Lorsque que j'exécute mon programme rien ne s'affiche en résultat mais quand je remplace le EXEC SQL DECLARE requete CURSOR FOR par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC SQL DECLARE requete CURSOR FOR SELECT TITRE FROM SUJET WHERE TITRE LIKE 'Les aventures du Dupont';
    j'ai plusieurs résultats qui s'affichent à l'écran.

    Peut-être un problème de syntaxe?!

    Merci d'avance et bonne journée.

    Cordialement

    _Virtuose_

  2. #2
    Expert confirmé 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
    Par défaut
    Avez vous essayé d'utiliser le type varchar pour vos variables sql_tableau et sql_result ?

  3. #3
    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
    Nann... Ca c'est pas possible !

    La seule chose que tu puisse faire c'est faire contruire une chaine avec toute les valeurs pour faire un "in('v1', 'v2', .... 'vX')"
    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

  4. #4
    Expert confirmé 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
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    Nann... Ca c'est pas possible !

    La seule chose que tu puisse faire c'est faire contruire une chaine avec toute les valeurs pour faire un "in('v1', 'v2', .... 'vX')"
    Salut Vincent,

    Je ne pense pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SQL> variable e1 varchar2(10)
    SQL> exec :e1 := 'SMITH'
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> select empno from emp where ename like :e1;
     
         EMPNO
    ----------
          7369
     
    SQL>
    Bon, ce n'est pas vraiment du pro*c () mais ça devrait tourner (ou j'ai raté quelque choses)

  5. #5
    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
    ce n'est pas le like + bind qui pose probleme mais le fait que le bind soit un tableau de valeurs...

    Bon, je viens de relire le post initial et m'apercoit que la variable n'est en fait qu'une simple chaine de caractère alors que je pensais que c'était un tableau de string.... 'sql_tableau'.... Comme le dis Virtuose, le C c'est pas son truc....

    Bon oublie ce que j'ai bien, je suis hors sujet car je pensais que le bind était un tableau de valeurs.....
    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

  6. #6
    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
    bon, j'ai relu le post....


    passer directement une chaine de caractères récupérée d'une entrée standard sans contrôle aucun et la passer directement à Oracle, c'est normal que ca marche pas et puis c'est pas très pro du tout !!

    pour que le like fonctionne :

    - déja il faut gérer la casse. donc passer en majuscule le contenu de sql_tableau et faire dans la requête un 'UPPER(TITRE) LIKE :sql_tableau'
    - ensuite, a moins que le gars soit une bête de littérature et d'orthographe, il faut entourer la valeur saisie en entrée par des %
    - faire des contrôles sur le contenu de sql_tableau (trimmer, supprimer les caractères non imprimables, les retours chariots, etc..)

    Ensuite cela pourra peut être marcher correctement ....
    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

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Par défaut
    Ayant 3 mois de pratique en programmation, j espèrais un peu plus de tolérance au lieu de dire tout de suite que le C n'est pas mon truc alors que je n ai encore que peu de recul, de plus il ne s agit pas d' un problème de C mais de proC.

    Heureusement que ça ne fait pas très pro sachant que je ne suis encore qu'un simple étudiant.

    Merci quand même d'avoir répondu.

  8. #8
    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
    Ok, mon avant dernier post peu paraitre un peu raide (cela n'était mon intention, tu accepteras peut être mes plate excuses )

    Mais, au delà de la forme, au lieu de te buter sur celle ci, regardes plutôt le fond et tu y verras des critiques de code/conseils tout a fait objectifs et bons à prendre pour tout débutant :

    - faire attention à ses entrée/sortie (surtout en C et avec fgets())
    - être sur qu'un contenu présenté à une fonction tierce soit ok et conforme (la, ta variable sql_tableau contient surement un caractère NL qui n'est pas épuré par fgets() et de plus aucun contrôle de la validité du contenu n'est effectué)
    - comprendre le fonctionnement de ce que l'on utilise (ici un like en SQL avec gestion de la casse et des %)
    - comprendre une techno/problème : le code avec la valeur en dur fonctionne mais pas avec ta variable. Donc c'est obligatoirement le contenu de ta variable qui fait que ton curseur ne retourne rien. Ce n'est pas PRO*C..

    Donc, au final, c'est un soucis purement C et non PRO*C.

    Voila, je t'ai donné les clés pour résoudre ton problème

    bon courage pour la suite.

    PS : ton pseudo est un pseudo lourd a porter...

    Citation Envoyé par _Virtuose_ Voir le message
    Ayant 3 mois de pratique en programmation, j espèrais un peu plus de tolérance au lieu de dire tout de suite que le C n'est pas mon truc alors que je n ai encore que peu de recul, de plus il ne s agit pas d' un problème de C mais de proC.

    Heureusement que ça ne fait pas très pro sachant que je ne suis encore qu'un simple étudiant.

    Merci quand même d'avoir répondu.
    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

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Par défaut
    Merci pour votre réponse, j'ai été un peu refroidi sur le coup (étant nouveau sur le site en plus, bien que je le consulte régulièrement)


    Pour ce qui est de la gestion de la casse et des %, j'en ai fait abstraction ici comme mon problème ne concernait pas ce point, de même pour la sécurité des I/O^^.

    Bonne soirée et merci pour vos conseils.

  10. #10
    Expert confirmé 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
    Par défaut
    Bref, voilà un exemple pour commencer avec le PRO*C. Essaye de comprendre pourquoi on utilise la structure (PRO*C) varchar (a ne pas confondre avec le type varchar ou varchar2 du SQL).

Discussions similaires

  1. [Unity Pro XL] Problème déclaration tableau de mots.
    Par flog73 dans le forum Automation
    Réponses: 10
    Dernier message: 25/08/2023, 08h32
  2. [PRO*C] Allocation dynamique d'un tableau de VARCHAR
    Par NéalZheimer dans le forum Interfaces de programmation
    Réponses: 5
    Dernier message: 07/07/2006, 13h02
  3. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15
  4. Réponses: 4
    Dernier message: 13/05/2002, 16h43
  5. [PRO*C] Recherche information
    Par Anonymous dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 04/04/2002, 17h53

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