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

PostgreSQL Discussion :

Créer une vue en langage C


Sujet :

PostgreSQL

  1. #1
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut Créer une vue en langage C
    Salut
    J'ai un projet dans lequel je voudrais masquer certaines de mes vues dans des procédures en langage C.
    En effet, ma base est sur PostgreSQL et l'interface est en ACCESS. Quand j'installe la base sur le serveur du client, l'administrateur du serveur a accès aux codes source de ma base sur PostgreSQL.
    L'objectif est alors de créer quelques unes de mes vues dans des procédures en langage C.
    Jusqu'à présent, j'ai réussi à faire uniquement des fonctions qui retournent des types simples en langage C. J'ai tenté de comprendre le mécanisme mais il est trop compliqué (trop de pointeurs et de structures compliquées) ; et les exemples de la doc utilisent des lignes créées et non des lignes de tables.
    Si vous avez un exemple ?
    Merci d'avance.
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    J'ai trouvé un code que j'ai travaillé un peu...
    La fonction en C

    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
    #include "postgres.h"
    #include "fmgr.h"
    #include "executor/spi.h"
    #include "funcapi.h" // to return set of rows and cope with tuples
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h> 
    PG_MODULE_MAGIC; 
    PG_FUNCTION_INFO_V1(get_level1_c);
    PGDLLEXPORT 
            Datum
            get_level1_c(PG_FUNCTION_ARGS)
            {
                int spi_ret;
                char sql[100]; 
                char *id;
                FuncCallContext *funcctx;
                MemoryContext oldcontext;
                Datum result;
     
                if (SRF_IS_FIRSTCALL()) {
                    funcctx = SRF_FIRSTCALL_INIT();
                    oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
     
     
                    SPI_connect(); 
                    snprintf(sql, sizeof(sql), "SELECT id, prenom, lenom  FROM personne;");
     
                        spi_ret = SPI_execute(sql, true, 0);
     
                        funcctx->max_calls = SPI_processed;
     
                    MemoryContextSwitchTo(oldcontext);
                }
     
                funcctx = SRF_PERCALL_SETUP();
     
                if (funcctx->call_cntr < funcctx->max_calls) {
    				HeapTuple tuple = SPI_tuptable->vals[funcctx->call_cntr];// ligne que j'ai ajouté	
                        //id = SPI_getvalue(SPI_tuptable->vals[funcctx->call_cntr], SPI_tuptable->tupdesc, 1);
     
                    //result = Int32GetDatum(atoi(id));
     
    				result=HeapTupleGetDatum(tuple);// ligne que j'ai ajouté	
                    SRF_RETURN_NEXT(funcctx, result);
                } else {
                    SPI_finish();
                    SRF_RETURN_DONE(funcctx);
                }
            }
    La fonction correspondante dans postgresql...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE OR REPLACE  FUNCTION get_level1_c(IN integer)
      RETURNS table(id integer, prenom character varying(30),  lenom character varying(20)) AS
    'fnpgsqlsrf.dll', 'get_level1_c'
      LANGUAGE C
    Sans les lignes ajoutées j'obtiens une seule colonne. J'ai essayé d'avoir plusieurs colonnes mais j'ai l'erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERREUR: cache lookup failed for type 0
    État SQL :XX000
    J'ai vraiment besoin de votre aide pour compléter cette fonction.
    Merci d'avance.
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  3. #3
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut La solution
    Salut
    J'ai finalement trouvé une solution par SPI_returntuple dans la doc. Grand merci à vous.
    Le code en C
    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
     
    #include "postgres.h"
    #include "fmgr.h"
    #include "executor/spi.h"
    #include "funcapi.h" 
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h> 
    PG_MODULE_MAGIC; 
    PG_FUNCTION_INFO_V1(vpersonne);
    PGDLLEXPORT 
            Datum
            vpersonne(PG_FUNCTION_ARGS)
            {
    	int spi_ret;
                char sql[100];            
                FuncCallContext *funcctx;
                MemoryContext oldcontext;
                Datum result;
     
                if (SRF_IS_FIRSTCALL()) {
                    funcctx = SRF_FIRSTCALL_INIT();
                    oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
     
                    SPI_connect(); 
                    snprintf(sql, sizeof(sql), "SELECT id, prenom, lenom  FROM personne;");
     
                        spi_ret = SPI_execute(sql, true, 0);
     
                        funcctx->max_calls = SPI_processed;
     
                    MemoryContextSwitchTo(oldcontext);
                }
     
                funcctx = SRF_PERCALL_SETUP();
     
                if (funcctx->call_cntr < funcctx->max_calls) {
    				result=PointerGetDatum(SPI_returntuple(SPI_tuptable->vals[funcctx->call_cntr],SPI_tuptable->tupdesc));
    				SRF_RETURN_NEXT(funcctx, result);
                } else {
                    SPI_finish();
                    SRF_RETURN_DONE(funcctx);
                }
            }
    La fonction dans PostgreSQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE OR REPLACE FUNCTION vpersonne(integer)
      RETURNS SETOF record AS
    'fnpgsqlsrf.dll', 'vpersonne'
      LANGUAGE c
    Le test de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from  vpersonne(null) as (id int, prenom varchar, nom varchar);
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

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

Discussions similaires

  1. Créer une vue sous Access 2003
    Par jlvalentin dans le forum Access
    Réponses: 5
    Dernier message: 22/08/2006, 12h29
  2. [9iR2][PL/SQL] Comment créer une vue dans un package ?
    Par mainecoon dans le forum Oracle
    Réponses: 6
    Dernier message: 22/02/2006, 08h10
  3. [requète sql] Créer une vue ordonnée
    Par gangsoleil dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/01/2006, 18h34
  4. Créer une vue avec des requêtes UNION ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2005, 12h37
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22

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