PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 31/05/2013 16:23:02

magellus
Membre

RESOLU - erreur de input dans un integer

J'ai ce message d'erreur lorsque je tente une fonction de recherche et d'insertion dans ma bd.


ERROR:  invalid input syntax for integer: "Stokesbay"
CONTEXT:  PL/pgSQL function "correctcity" line 7 at FOR over SELECT rows
********** Error **********
ERROR: invalid input syntax for integer: "Stokesbay"
SQL state: 22P02
Context: PL/pgSQL function "correctcity" line 7 at FOR over SELECT rows


Mon problème, c'est que je n'essai pas d'insérer un text dans un integer...
je veux seulement peupler une table avec les infos d'une autre table.


Si je décortique ma requête et que je test chaque partie séparément tout fonctionne,
mais lorsque je la met en fonction j'ai cette erreur.


Quelqu'un peux me dire où je me suis trompé?
Merci d'avance!


Je travaille avec postgresql 9.1 et pgadmin version 1.14


voici ma fonction:

CREATE OR REPLACE FUNCTION correctCity() RETURNS SETOF res_partner AS
$BODY$
DECLARE
    coll res_partner%rowtype;
    myvar integer;
BEGIN
    myvar = 0;
    FOR coll IN SELECT distinct(city) city, state_id FROM res_partner WHERE id > 0 and state_id is not null
    LOOP
        myvar = myvar + 1;
        INSERT INTO erpq_city( id, create_uid, create_date, write_date, write_uid, info, state_id, name)
        VALUES (myvar, 1, now(), now(), 1,'' , coll.state_id, coll.city);
    END LOOP;
    RETURN;
END
$BODY$
LANGUAGE 'plpgsql' ;

SELECT * FROM correctCity();

Dernière modification par magellus (04/06/2013 20:09:27)

Hors ligne

#2 31/05/2013 19:50:54

gleu
Administrateur

Re : RESOLU - erreur de input dans un integer

Difficile à dire sans connaître la définition des différents objets : res_partner et erpq_city. Il me semble que res_partner doit contenir plus de deux colonnes et que la deuxième doit être de type entier alors que la colonne city est certainement un type texte. Oui, en relisant la requête, il est clair que res_partner contient plus de deux colonnes.


Guillaume.

Hors ligne

#3 03/06/2013 17:19:47

magellus
Membre

Re : RESOLU - erreur de input dans un integer

En effet, res_partner est un objet qui contient les différentes information d'un partnaire, et erpq_city une table simple contenant les champs d'info d'une ville.


Les 2 tables contiennent le champ "state_id" qui est un champs référentiel pointant sur une 3e table res_country_state contenant les infos des états d'un pays.


Je comprend le questionnement sur le contenu des tables, mais je crois que je n'ai utilisé que le contenu d'une requête simple pour faire mon insertion dans erpq_city...


Le SELECT de la boucle for n'a que 2 colonnes et elle sont explicitement utilisé dans le update dont l'ordre est respecté pour l'insertion des valeurs...


Donc en prenant pour acquis que city est un champs texte et que j’essaie de l'insérer dans un autre champs texte
et que state_id est un champs numérique, et que j’essaie aussi de l'insérer dans un champs numérique.


Je ne comprend pas l'erreur, c'est probablement dû à quelque chose que je ne fait pas comme du monde mais j'ignore quoi.


Pour information, je développe sous Openerp toute les table on la structure de base [id, create_user, create_date, write_date, write_user, ...]
et j'ai pris soin de peupler chacun de ces champs lors de mon insertion.


autre info, c'est un script d'initialisation qui ne sera passé qu'une seule fois et sur une table vide.


Merci encore pour votre aide!

Hors ligne

#4 03/06/2013 22:10:34

gleu
Administrateur

Re : RESOLU - erreur de input dans un integer

Le problème n'a rien à voir avec l'insertion, il concerne le SELECT. Vous déclarez coll de type res_partner, donc coll est une ligne de définition identique à res_partner. Si la première colonne de res_partner est une colonne entière, alors city de type text ne peut pas y être collé. Et ce n'est pas parce que votre SELECT récupère des données de res_partner que ça doit fonctionner. Pour PostgreSQL, votre boucle FOR ressemble à ça :

FOR coll IN SELECT 'qqc qui doit être du texte', qqc_qui_est_certainement un entier ...

Bref, si vous confirmez que la première colonne de res_partner est un entier, faites plutôt ça dans le DECLARE :

v_city text;
v_state_id integer;

et remplacez la boucle par :

FOR v_city, v_state_id IN SELECT distinct(city) city, state_id FROM res_partner WHERE id > 0 and state_id is not null
    LOOP
        myvar = myvar + 1;
        INSERT INTO erpq_city( id, create_uid, create_date, write_date, write_uid, info, state_id, name)
        VALUES (myvar, 1, now(), now(), 1,'' , v_state_id, v_city);
    END LOOP;

Ceci dit, cette boucle serait beaucoup plus performante en intégrant le SELECT dans l'INSERT.


Guillaume.

Hors ligne

#5 04/06/2013 19:03:36

magellus
Membre

Re : RESOLU - erreur de input dans un integer

Merci beaucoup!


Ça l'a fonctionné!


C'était donc ma façon de faire qui ne fonctionnait pas! Je suis trop habitué de travailler avec les objet Openerp en python qui font presque tout pour nous!


Par contre je ne suis pas sur de saisir ce que tu veux dire par intégrer le SELECT dans le INSERT...
Est-ce qu'il va faire une insertion massive avec toute les données collecté dans le SELECT?


Ou sinon comment je fait pour faire une boucle sur tout les partenaire répondant aux critères de mon SELECT.


Dans tout les cas mon problème est résolu!
... mais je ne voit pas de bouton résolu dans l'interface...


Merci!

Hors ligne

#6 04/06/2013 23:00:17

gleu
Administrateur

Re : RESOLU - erreur de input dans un integer

Faire un INSERT du type :

INSERT INTO erpq_city( id, create_uid, create_date, write_date, write_uid, info, state_id, name) SELECT distinct(city) myvar, 1, now(), now(), 1,'', city, state_id FROM res_partner WHERE id > 0 and state_id is not null;

La requête n'est pas vraiment exacte, notamment à cause du myvar mais rien qu'une séquence ne saurait arrangé.


Guillaume.

Hors ligne

Pied de page des forums