Quelqu'un fait un peu de Pl/pg sql [EDIT]

Quelqu'un fait un peu de Pl/pg sql [EDIT] - SQL/NoSQL - Programmation

Marsh Posté le 24-02-2006 à 14:12:19    

Bonjour ,
 
 
EDIT: Bon le probléme je l'ai réglé en faisant tout dans la meme fonction.
 
Mais là une question, il me faut un moment dans le programme, mettre un valeur dans un champs de type tableau qui ne peux être inialise..
je fais un select de cette valeur ce qui me dis dans un notice:
 
variable "%"     -----> variable "<NULL>"
 
mais jarrive pas derriére, à touver la condition qu'il faut pour dire :
 
si valeur = <NULL> alors mettre à 0
 
 
Merci d'avance... :hello:  
 
 
cette année petit projet en base de donné et on a l'honneur devoir apprendre le plpgsql,  
ça a l'air d'un bon petit langage de programmation bien puissant ;)
 
Mais j'ai des bug inexplicable: je m'explique:
 
j'ai 3 tables, l'une contenant des données considérable que nous devons analyser et mettre dans les autres table...Sur la logique pas de probléme...
 
donc :
 

Code :
  1. -- table a traiter
  2. CREATE TABLE articles2 (
  3. id serial,
  4. auteur varchar(3000),
  5. titre varchar(3000),
  6. abstract varchar(5000),
  7. primary key (id)
  8. );
  9. CREATE TABLE article (
  10. id serial,
  11. titre varchar(3000),
  12. abstract varchar(5000),
  13. PRIMARY KEY (id)
  14. );
  15. --Table pour les auteurs avec correspondance aux articles
  16. CREATE TABLE auteur (
  17. id serial,
  18. id_article integer,
  19. nom varchar(255),
  20. prenom varchar(255),
  21. PRIMARY KEY(id),
  22. FOREIGN KEY (id_article) REFERENCES article(id)
  23. );


 
puis j'ai commener a tape 2-3 fonction, l'une d'elle pour découper dans articles 2 les champs auteur:
 

Code :
  1. CREATE FUNCTION split_auteur(text) RETURNS INTEGER AS '
  2. DECLARE
  3.   chaine TEXT;
  4.   count INTEGER;
  5. BEGIN
  6.   RAISE NOTICE ''error % '',$1;
  7.   chaine:= $1;
  8. LOOP
  9.   IF(length(split_part(chaine,'' '',2))=0) THEN
  10.     EXIT;
  11.   ELSE
  12.     INSERT INTO auteur (nom,prenom) VALUES (split_part(chaine,'' '',1),split_part(chaine,'' '',2));
  13.   END IF;
  14.   IF(length(chaine)=length(split_part(chaine,'' '',1))+1+length(split_part(chaine,'' '',2))) THEN
  15.     EXIT;
  16.   ELSE
  17.     chaine:=overlay(chaine placing '''' from 1 for (length(split_part(chaine,'' '',1))+1+length(split_part(chaine,'' '',2)))+1);
  18.   END IF;
  19. END LOOP;
  20. RETURN 0;
  21. END;'
  22. LANGUAGE 'plpgsql';


 
qui marche nickel avec un :  

Citation :

select split_auteur('Daxin Jiang Jian Pein Aidong Zhang');
select * from auteur;


ou  

Citation :

select split_auteur('Daxin Jiang Jian Pein Aidong');
select * from auteur;


 
Mais alors now, je veux pour chaque liste d'auteur:
 

Code :
  1. CREATE FUNCTION parcours_all() RETURNS VOID AS '
  2. DECLARE
  3.   ida RECORD;
  4.   a INTEGER;
  5. BEGIN
  6. FOR ida IN SELECT * FROM articles2 LOOP
  7.   SELECT split_auteur(ida.auteur) INTO a;
  8. END LOOP;
  9. END;'
  10. LANGUAGE 'plpgsql';


 
Voilà ben ça me fais des bug assez aléatoire:
 

Citation :

ERROR:  cache lookup failed for function 32911
CONTEXT:  SQL statement "SELECT  insert_title_abstract( $1 , $2 )"
PL/pgSQL function "parcours_all" line 6 at select into variables


 
 
Merci d'avance


Message édité par xtof_83 le 25-02-2006 à 02:18:43
Reply

Marsh Posté le 24-02-2006 à 14:12:19   

Reply

Marsh Posté le 25-02-2006 à 02:20:44    

[:baobab] car modification du probléme ;)
 
en espérans avoir plus de succé cette fois...
 
Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed