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

SQL Firebird Discussion :

Problème SELECT sur une vue sous FB 2.0


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Responsable BE Electrique développement
    Inscrit en
    Juin 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable BE Electrique développement

    Informations forums :
    Inscription : Juin 2002
    Messages : 8
    Par défaut Problème SELECT sur une vue sous FB 2.0
    Bonjour tout le monde,

    Je vous expose mon problème.

    Enfin tout d'abord, un petit apercu de l'infrastructure...
    Je suis sur une Ubuntu 5.04. Sur celle-ci, j'ai un serveur Firebird 2.0 RC5 (j'ai également fait le test avec Firebird 1.5.1 avec les mêmes résultats).
    J'utilise l'API native fournie avec Firebird.

    Maintenant la base de données (enfin pour le test, c'est vraiment ridicule mais ca permet de bien fixer le problème).
    Une table: TOTO qui contient un champ "nb".
    Une vue: VTOTO qui représente un "SELECT nb FROM TOTO".

    Jusque la, c'est pas trop dur.
    Voici le code permettant d'afficher toutes les valeurs contenues dans TOTO.nb

    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
     
     
     
    #include <stdio.h>
    #include <ibase.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define USER		"POLYSOUDE"
    #define PASSWD		"POLYSOUDE"
    #define DB_NAME		"localhost:/home/yme/tmp/test.fdb"
     
    void db_print_error(ISC_STATUS *stat)
    {
    	if (stat != NULL)
    	{
    		isc_print_status(stat);
    		printf("\nCode de l'erreur SQL:\n");
    		isc_print_sqlerror(isc_sqlcode(stat),stat);
    	}
    }
     
    int main(int argc, char **argv) 
    {
    	char param[256];
    	char *ptr_param;
    	int param_len;
    	isc_stmt_handle stmt = 0;
    	isc_tr_handle h_trans = 0;
    	ISC_STATUS stat[20];
    	isc_db_handle h_db = 0;
     
    	ptr_param = param;
    	*ptr_param++ = isc_dpb_version1;
    	*ptr_param++ = isc_dpb_user_name;
    	*ptr_param++ = strlen(USER);
    	strncpy(ptr_param, USER, strlen(USER));		//il ne faut pas copier le 0 de fin de chaine
    	ptr_param += strlen(USER);
    	*ptr_param++ = isc_dpb_password;
    	*ptr_param++ = strlen(PASSWD);
    	strncpy(ptr_param, PASSWD, strlen(PASSWD));
    	ptr_param += strlen(PASSWD);
    	param_len = ptr_param - param;
     
    	if (isc_attach_database(stat, 0, DB_NAME, &h_db, param_len, param))
    	//   if (isc_attach_database(stat, 0, NOM_BASE, db, 0, NULL))
    	{
    		db_print_error(stat);
    		return 1;
    	}
     
    	char query[] = "SELECT nb FROM TOTO";
    	long nb;
    	XSQLDA *sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(1));
    	sqlda->sqln = 1;
    	sqlda->sqld = 1;
    	sqlda->version = SQLDA_VERSION1;
     
    	sqlda->sqlvar[0].sqldata = (char *)&nb;
    	sqlda->sqlvar[0].sqltype = SQL_LONG;		//Le champ nom de la bdd ne peut pas contenir null. On ne vérifie donc pas si celui-ci est null.
     
    	if (isc_start_transaction(stat, &h_trans, 1, &h_db, 0, NULL))
    	{
    		db_print_error(stat);
    		return 1;
    	}
     
    	if (isc_dsql_allocate_statement(stat, &h_db, &stmt))
    	{
    		db_print_error(stat);
    		return 1;
    	}
     
    	if (isc_dsql_prepare(stat, &h_trans, &stmt, 0, query, 1, sqlda))
    	{
    		db_print_error(stat);
    		return 1;
    	}
     
    	if (isc_dsql_execute(stat, &h_trans, &stmt, 1, NULL))
    	{
    		db_print_error(stat);
    		return 1;
    	}
     
    	int res = 0;
    	do
    	{
    		res = isc_dsql_fetch(stat, &stmt, 1, sqlda);
     
    		if (res != 100 && res != 0)		//Erreur. Lorsque res vaut 100, il n'y a plus de données à lire
    			db_print_error(stat);
    		else
    		if (res == 0)
    			printf("nb: %ld\n", nb);
     
    	} while (res == 0);
     
    	if (isc_dsql_free_statement(stat, &stmt, DSQL_close))		//on libère les données précédemment allouées
    	{
    		db_print_error(stat);
    		return 1;
    	}
     
    	if (isc_commit_transaction(stat, &h_trans))
    	{
    		db_print_error(stat);
    		return 1;
    	}
     
    	return 0;
    }
    Rien de bien sorcier mais c'est juste pour le test.
    Ca marche très bien.
    Le problème se produit lorsque je veux faire la meme chose mais sur la vue (on remplace donc la requete par "SELECT nb FROM VTOTO".
    Et la, ca marche plus du tout.

    Voici le résultat de l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dynamic SQL Error
    -SQL error code = -804
    -Incorrect values within SQLDA structure
     
    Code de l'erreur SQL:
    SQLCODE: -804
    SQL ERROR:
    An error was found in the application program input parameters for the SQL statement.
     
    ISC STATUS:
    Dynamic SQL Error
    -SQL error code = -804
    -Incorrect values within SQLDA structure
    Sachant que le type de la donnée est exactement pareil, je vois pas pourquoi ca marche pas.

    Aidez moi SVP.
    Merci d'avance pour vos réponses.

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    donnes nous les définitions de la table et de la vue

  3. #3
    Membre du Club
    Profil pro
    Responsable BE Electrique développement
    Inscrit en
    Juin 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable BE Electrique développement

    Informations forums :
    Inscription : Juin 2002
    Messages : 8
    Par défaut
    La table: TOTO (nb INTEGER NOT NULL)
    La vue: SELECT nb FROM TOTO

  4. #4
    Membre du Club
    Profil pro
    Responsable BE Electrique développement
    Inscrit en
    Juin 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable BE Electrique développement

    Informations forums :
    Inscription : Juin 2002
    Messages : 8
    Par défaut
    J'espère avoir bien répondu à ce que tu demandais !


  5. #5
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    donnes moi stp exactement le code de création de tes objets

  6. #6
    Membre du Club
    Profil pro
    Responsable BE Electrique développement
    Inscrit en
    Juin 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable BE Electrique développement

    Informations forums :
    Inscription : Juin 2002
    Messages : 8
    Par défaut
    CREATE TABLE TOTO (nb INTEGER NOT NULL);
    CREATE VIEW VTOTO AS SELECT nb FROM TOTO;


    Puis pour insérer les données:
    INSERT INTO TOTO VALUES (5);

Discussions similaires

  1. SELECT sur une vue ORACLE (ZendFramework)
    Par Kevin91260 dans le forum Zend Framework
    Réponses: 2
    Dernier message: 22/07/2014, 09h28
  2. Réponses: 16
    Dernier message: 24/05/2013, 12h38
  3. Problème select sur table/vue x$ksppsv
    Par LBO72 dans le forum Administration
    Réponses: 4
    Dernier message: 25/03/2009, 09h07
  4. Privilège select sur une vue
    Par DjinnS dans le forum Administration
    Réponses: 2
    Dernier message: 23/01/2008, 14h41
  5. Temps d'execution d'un select sur une vue
    Par rosewood dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/02/2005, 16h06

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