|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
Salut,
j'aimerai créer une nouvelle table à partir d'une table déjà existante. La table existante a cette forme: tel_id | tel_home | tel_mobile | friends_id -------------------------------------------------------------------------------- 0000 | 1001 | 0601 | 100 0001 | 1002 | 0602 | 100 0002 | 1003 | 0603 | 200 0003 | 1004 | 0604 | 200 0004 | 1005 | 0605 | 300 0005 | 1006 | 0606 | 400 0006 | 1007 | 0607 | 400 0007 | 1008 | 0608 | 400 friends_id est une clé secondaire (en principe ca n'a pas d'importance). la nouvelle table devra ressembler à ceci: tel_id |tel_home1 |tel_mobile1 |tel_home2 |tel_mobile2 | friends_id --------------------------------------------------------------------------------------- 0000 |1001 |0601 |1002 |0602 |100 0001 |1003 |0603 |1004 |0604 |200 0002 |1005 |0605 | | |300 0003 |1006 |0606 |1007 |0607 |400 c'est-à dire par ligne juste une seule fois friends_id et pour plus de 3 numéros(par ex. friends_id = 400), le troisième n° sera tout simplement abandonné. comment est-ce ke je pourrais faire cela avec PSQL? Merci de votre aide. |
|
|
00
|
|
|
#2 | ||
|
Membre émérite
![]() ![]() Inscription : mars 2002 Messages : 770 ![]() |
Bonjour,
tu peux essayer une fonction comme ca : Code :
Il y a surrement plus optimisé mais je pense que deja ca te permettra d'avancer. |
||
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
Merci, merci, merci.
J'essaie et je te tiens informé! Bon week-end! |
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
Salut,
pour m'assurer avoir compris l'exemple proposé plus haut et après avoir longuement lu le tutoriel, j'ai essayé pour résoudre mon probleme le code suivant que j'exécute dans le shell. Ma question est de savoir pourkoi est-ce ke je recois l'erreur qui suit le code? Et est-ce ke les 'expression [index]' sont-ils bien utilisé dans la mesure où je voudrais vérifier une ligne et la suivante ? CREATE OR REPLACE FUNCTION transform_table_address() RETURNS SETOF attribut_address_2 AS $BODY$ DECLARE rec RECORD, o attribut_address_2, index INTEGER BEGIN SELECT rec.name1, rec.name2, rec.street, rec.zip, rec.zipcity, rec.country, rec.state FROM address WHILE rec.company_id[index] = rec.company_id[index + 1] AND rec.street[index + 1] NOT NULL LOOP RETURN NEXT O(rec.name1, rec.name2, rec.company_id, rec.street, rec.zip [index +1], rec.zipcity[index +1], rec.country[index+1], rec.state[index + 1]) IF rec.company_id[index] = rec.company_id [index +1+1] THEN NULL END IF END LOOP RETURN END $BODY$ LANGUAGE 'plpgsql'; --voici l'erreur ERROR: parser: parse error at or near "$" at character 90 |
|
|
00
|
|
|
#5 |
|
Membre émérite
![]() ![]() Inscription : mars 2002 Messages : 770 ![]() |
Je pense qu'il y a beaucoup d'erreur dans ce code :
- il manque des points virgules a chaque fin d'instruction (déclaration des variables aussi) - evite d'utiliser des mots clefs dans tes variables comme index - un type record est une ligne pas une sorte de array, on ne peut donc pas acceder a l'enregistrement suivant avec un index - rec.company_id[index] = rec.company_id[index + 1] AND rec.street[index + 1] NOT NULL ne retourne pas un boolean fait plutot rec.company_id[index] = rec.company_id[index + 1] AND rec.street[index + 1] IS NOT NULL - essaye d'identer ta fonction, c'est plus facile pour debuger en tout cas c'est un bel effort, continue comme ca, tu va voir meme si plpgsql est un language simple, ca va te faciliter la vie dans bien des situations |
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
C'est motivant les encouragements du genre!
Quand j'entre le code dans le shell avec des points virgules, je recois des erreurs, mais en les enlevant elles disparaissent toutes jusqu'à celle cité plus haut. J'ai aussi essayé le code que tu m'as proposé en le restructurant en fonction de de mes besoins, mais toujours la meme erreur. Je continue en tout cas de chercher. PS: c'est koi identer une fonction? |
|
|
00
|
|
|
#7 | |
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
Citation:
|
|
|
|
00
|
|
|
#8 | ||||
|
Membre émérite
![]() ![]() Inscription : mars 2002 Messages : 770 ![]() |
Identé, c'est mettre en forme, decaler les block par des tab ou espaces :
Code :
Code :
Si tu peux fait un screenshot |
||||
|
|
00
|
|
|
#9 |
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
Ok du nouveau,
Alors l'erreur que j'obtenais jusqu'ici venait de la définition de ma fonction. Au lieu de CREATE OR REPLACE FUNCTION nom_de_la_fonction () RETURNS type AS $BODY$ DECLARE déclaration BEGIN ... END $BODY$ LANGUAGE 'plpgsql' ca aurait du etre CREATE OR REPLACE FUNCTION nom_de_la_fonction () RETURNS type AS ' --ici DECLARE déclaration BEGIN ... END' --ici LANGUAGE 'plpgsql' résultat: ERROR: language "plpqsql" doest not exist Maintenant je dois déclarer le language plpgsql dans ma base. Mais en utilisant CREATE LANGUAGE 'plpgsql'; ou avec la fonction createlang nomlang ; je recois comme erreur : ERROR: parser: parse error at or near ";" que faire? |
|
|
00
|
|
|
#10 |
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
Je crois savoir pourqoui est-ce que j'ai tant de problème. C'est surement à cause de ma version de PostgreSQL. Version 7.3.10. Comment est-ce que je fais un update?
|
|
|
00
|
|
|
#11 |
|
Membre émérite
![]() ![]() Inscription : mars 2002 Messages : 770 ![]() |
pour installer le plpgsql, tu te met en shell comme si tu lancais psql, mais tu lance une autre commande : createlang
cette commande est bien un programme et pas une commande SQL a faire sous psql. |
|
|
00
|
|
|
#12 | ||
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
Ok tout est fait. Maintenant j'ai une erreur dans ma compilation. Voici le code:
Code :
Qu'est-ce ke ca peut bien etre? |
||
|
|
00
|
|
|
#13 |
|
Membre émérite
![]() ![]() Inscription : mars 2002 Messages : 770 ![]() |
Dans un SELECT INTO var1, var2 val1,val2 FROM matable
il n'y a par de virgule entre la derniere variable et la premiere valeur ensuite tu ne peut pas ecrire IF (SELECT company_id FROM address WHERE company_id = rec.company_id IS NOT NULL ) THEN EXIT; END IF; le IF ne peut pas evaluer une requete, il faut que tu la traite avant. en tout cas c'est pas mal, je ne regarde pas le coté algo mais seulement la syntaxe. |
|
|
00
|
|
|
#14 | ||||
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
Après avoir corrigé le code, le problème reste le meme. Il a un problème avec le type que j'attribut à RETURN NEXT o
Code :
Code :
|
||||
|
|
00
|
|
|
#15 |
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
je me suis rendu compte que j'avais oublié SETOF dans le RETURNS de la fonction. Mais jusque la toujours la meme erreur!
|
|
|
00
|
|
|
#16 |
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
quelqu'un peut-il m'aider, je ne trouve tjrs pas l'erreur?
|
|
|
00
|
|
|
#17 | ||||
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 25 ![]() |
Voici la solution à mon problème:
Code :
Code :
|
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com