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 :

problème pl/pgSQL - Erreur lors de l'exécution (long)


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 16
    Points : 16
    Points
    16
    Par défaut problème pl/pgSQL - Erreur lors de l'exécution (long)
    Bonjour à tous,
    je suis en train de préparer une petite routine qui permet d'extraire tous les codes postaux à partir d'un code postal donné et d'un rayon en kms.
    J'utilise les bases geonames pour cela (www.geonames.org).

    CREATE TABLE geoname
    (
    geonameid integer,
    name character varying(200),
    asciiname character varying(200),
    alternatenames character varying(4000),
    latitude double precision,
    longitude double precision,
    fclass character(1),
    fcode character varying(10),
    country character varying(2),
    cc2 character varying(60),
    admin1 character varying(80),
    admin2 character varying(80),
    admin3 character varying(80),
    admin4 character varying(80),
    population integer,
    elevation integer,
    gtopo30 integer,
    timezone character varying(40),
    moddate date
    );

    CREATE TABLE countryinfo
    (
    iso_alpha2 character(2),
    iso_alpha3 character(3),
    iso_numeric integer,
    fips_code character varying(3),
    name character varying(200),
    capital character varying(200),
    areainsqkm double precision,
    population integer,
    continent character(2),
    languages character varying(200),
    currency character(3),
    geonameid integer
    );

    insert into countryinfo(iso_alpha2,name) values ('FR','France');
    insert into geoname(name,fcode,country,latitude,longitude) values ('Lille','59000','FR',50.628,3.059);
    insert into geoname(name,fcode,country,latitude,longitude) values ('Roubaix','59100','FR',50.7,3.167);
    insert into geoname(name,fcode,country,latitude,longitude) values ('Hordain','59111','FR',50.267,3.317);

    J'ai créé quelques fonctions - qui fonctionnent! - :
    CREATE OR REPLACE FUNCTION haversine(double precision, double precision, double precision, double precision)
    RETURNS double precision AS
    '
    /*
    Retourne la distance de Haversine deux points
    Appel : Latitude1,Longitude1, Latitude2, Longitude2 en degrés, min.
    Retourne : distance en kms.
    */

    DECLARE
    Latitude1 alias for $1;
    Longitude1 alias for $2;
    Latitude2 alias for $3;
    Longitude2 alias for $4;
    distance float8;
    BEGIN
    distance := 6372.795 * 3.1415926 *
    sqrt(
    (Latitude1-Latitude2)*(Latitude1-Latitude2)
    +
    cos(Latitude1/57.29578)*cos(Latitude2/57.29578)*(Longitude1-Longitude2)*(Longitude1-Longitude2)
    )
    / 180;
    return distance;
    END;
    '
    LANGUAGE 'plpgsql' VOLATILE STRICT;


    CREATE OR REPLACE FUNCTION litlatitude(bpchar, bpchar)
    RETURNS double precision AS
    '
    /*
    Renvoie la latitude en fonction du pays et du code postal
    Appel : select * from litLatitude(pays,codepostal)
    Exemple : select * from litLatitude("FR","69640");
    */
    select latitude from geoname where country like $1 and fcode like $2 limit 1;
    '
    LANGUAGE 'sql' VOLATILE STRICT;

    CREATE OR REPLACE FUNCTION litlongitude(bpchar, bpchar)
    RETURNS double precision AS
    '
    /*
    Renvoie la longitude en fonction du pays et du code postal
    Appel : select * from litLongitude(pays,codepostal)
    Exemple : select * from litLongitude("FR","69640");
    */
    select longitude from geoname where country like $1 and fcode like $2 limit 1;
    '
    LANGUAGE 'sql' VOLATILE STRICT;

    Et une fonction qui devrait renvoyer tous les codes postaux à partir d'une simple instruction du type
    select * from getPostalCode('FR','59000',80);
    Je devrais avoir tous les codes postaux dans les 80 kms autour de Lille (y compris la Belgique que j'ai dans la base).


    create type sortie as (country character(2), countryname character(200), fcode character(8));

    create or replace function getPostalCode (character(2), character(8), double precision)
    returns setof sortie as '
    declare
    myCountry alias for $1;
    myFcode alias for $2;
    distance alias for $3;
    maLatitude float8;
    maLongitude float8;
    centre record;
    r sortie;
    begin
    maLatitude := litlatitude(myCountry,myFcode);
    maLongitude := litlongitude(myCountry,myFcode);
    for r in (
    SELECT distinct
    geoname.country as country, countryinfo.name as countryname, geoname.fcode as fcode
    FROM geoname, countryinfo
    WHERE haversine(geoname.Latitude,geoname.Longitude,maLatitude,maLongitude) <= distance
    and
    geoname.country::character(2)= countryinfo.iso_alpha2
    order by geoname.country, geoname.fcode
    )
    loop
    return next r;
    end loop;
    return;

    end

    '
    LANGUAGE 'plpgsql' VOLATILE STRICT;

    Or cette fonction me renvoie une erreur que je n'arrive pas à cerner malgré de très nombreux essais
    WARNING: plpgsql: ERROR during compile of getpostalcode near line 12

    ERROR: missing .. at end of SQL expression

    ********** Erreur **********

    ERROR: missing .. at end of SQL expression

    Une âme charitable verrait-elle directement où je commets une erreur ?

    Merci d'avance.

    Alain

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 143
    Points
    143
    Par défaut
    for r in ( SELECT ...)
    Supprime les parenthèses, ce sont elles qui te posent soucis à mon avis. Tu dois avoir qqc dans ce style :


  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Merci pour cette information. J'avais essayé avec et sans parenthèses mais sans succès!
    Il me semble que l'instruction la plus logique est :

    CREATE OR REPLACE FUNCTION getpostalcode(bpchar, bpchar, double precision)
    RETURNS SETOF sortie AS
    '
    declare
    myCountry alias for $1;
    myFcode alias for $2;
    distance alias for $3;
    maLatitude float8;
    maLongitude float8;
    centre record;
    r sortie;

    begin
    maLatitude := litlatitude(myCountry,myFcode);
    maLongitude := litlongitude(myCountry,myFcode);

    begin
    for r in EXECUTE ''
    SELECT distinct
    geoname.country, countryinfo.name, geoname.fcode
    FROM geoname, countryinfo
    WHERE haversine(geoname.Latitude,geoname.Longitude, '' || maLatitude || '','' || maLongitude || '') <= '' || distance ''
    and
    geoname.country::character(2)= countryinfo.iso_alpha2
    order by geoname.country, geoname.fcode
    '' loop
    return next r;
    end loop;
    return;

    end

    '
    LANGUAGE 'plpgsql' VOLATILE STRICT;

    Mais malheureusement, le message subsiste :
    WARNING: plpgsql: ERROR during compile of getpostalcode near line 15
    ERROR: missing .. at end of SQL expression
    ********** Erreur **********
    ERROR: missing .. at end of SQL expression

    En tout cas, merci.

    Alain

  4. #4
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 562
    Points : 7 263
    Points
    7 263
    Par défaut
    Si je compte bien, tu as deux BEGIN et un seul END...
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

Discussions similaires

  1. Erreur lors de l'exécution
    Par ami_in55 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 02/02/2007, 14h08
  2. Erreur lors de l'exécution d'un prog (petit)
    Par zafo dans le forum Delphi
    Réponses: 9
    Dernier message: 26/08/2006, 00h07
  3. Erreur lors de l'exécution
    Par pochsdeluc dans le forum C++
    Réponses: 3
    Dernier message: 05/07/2006, 15h35
  4. [tableau] erreur lors de l'exécution
    Par michel_frederic dans le forum C++
    Réponses: 3
    Dernier message: 16/02/2006, 02h25
  5. [JMF][débutant] Erreur lors de l'exécution
    Par july dans le forum Multimédia
    Réponses: 7
    Dernier message: 19/01/2006, 11h30

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