[SGBD] PL/SQL qui kaput

PL/SQL qui kaput [SGBD] - SQL/NoSQL - Programmation

Marsh Posté le 20-08-2004 à 12:38:16    

Oralce 8
 
J'ai un collègue qui tente de faire un PL tout bête pour recopier des champs d'une table dans une autre.
 
Et ça merde, et il ne sais pas pourquoi. Moi, le PL/SQL, j'y connais que dalle, et le peux que j'en ai vu, je préfère le T-SQL (hé oui, même M$ arrive à faire un langage pourtant dérivé du VB qui est moins merdique, c'est pour dire)
 


declare myvar varchar2(30) ;
myvar2 varchar2(4000);
cursor cur_vue (name varchar2,text long)
is
select rpad(view_name,30,' ') , text From all_views  
where rownum = 1 ;
begin  
for enreg_vue in cur_vue
loop
 myvar := enreg_vue.name ;
 myvar2 := enreg_vue.text ;
 insert into vuesql values (myvar,myvar2);
end loop;
end;


 
L'erreur :

Citation :

The following error has occurred:
 
ORA-06550: line 8, column 18:
PLS-00306: wrong number or types of arguments in call to 'CUR_VUE'
ORA-06550: line 8, column 1:
PL/SQL: Statement ignored

Reply

Marsh Posté le 20-08-2004 à 12:38:16   

Reply

Marsh Posté le 20-08-2004 à 16:10:26    

Salut !
 
ben déjà 2 choses : je vois pas trop l'intéret d'un curseur alors que tu prends rownum=1, mais bon pourquoi pas. Ensuite dans le curseur il n'y a pas besoin de paramètres puisqu'ils ne sont pas utilisés dans la requête... :D  
 
Donc j'écrirais ca comme ca:
 
declare myvar varchar2(30) ;  
myvar2 varchar2(4000);  
cursor cur_vue  
is  
select rpad(view_name,30,' ') , text From all_views  
where rownum = 1 ;  
begin    
open cur_vue;
fetch cur_vue into myvar,myvar2;
loop  
exit when cur_vue%notfound;
 insert into vuesql values (myvar,myvar2);
 fetch cur_vue into myvar,myvar2;  
end loop;  
end;  
 
et là, ca devrait mieux marcher... :)

Reply

Marsh Posté le 20-08-2004 à 16:21:10    

on peut aussi faire :
 

Code :
  1. INSERT INTO vuesql
  2. (SELECT rpad(view_name,30,' ') , text
  3. FROM all_views 
  4. WHERE rownum = 1);


 
:D

Reply

Marsh Posté le 20-08-2004 à 16:47:02    

toutafé ! :jap:  
mais si le but était de faire un bloc PL/SQL, ben là c'est raté... :whistle:  

Reply

Marsh Posté le 20-08-2004 à 18:07:27    

jielbi a écrit :

Salut !
ben déjà 2 choses : je vois pas trop l'intéret d'un curseur alors que tu prends rownum=1, mais bon pourquoi pas. Ensuite dans le curseur il n'y a pas besoin de paramètres puisqu'ils ne sont pas utilisés dans la requête... :D  


Le rownum = 1 est là parceque la requête est loin d'être finie, c'est en cours d'écriture, et vu que ça merde d'entrée, il n'est pas allé plus loin ;)
 

jielbi a écrit :

Donc j'écrirais ca comme ca:
 
declare myvar varchar2(30) ;  
myvar2 varchar2(4000);  
cursor cur_vue  
is  
select rpad(view_name,30,' ') , text From all_views  
where rownum = 1 ;  
begin    
open cur_vue;
fetch cur_vue into myvar,myvar2;
loop  
exit when cur_vue%notfound;
 insert into vuesql values (myvar,myvar2);
 fetch cur_vue into myvar,myvar2;  
end loop;  
end;  
et là, ca devrait mieux marcher... :)


OK, je lui dit de tenter cette syntaxe. A priori, son code n'a pas sauté aux yeux d'un DBA ici, donc ça faisait la même chose (sans passer par le fetch)
 
A noter que le "text" est de type "LONG", et c'est ça qui merde en fait (vous pouvez tester, c'est une table système d'Oracle)

Reply

Marsh Posté le 20-08-2004 à 18:08:38    

Beegee a écrit :

on peut aussi faire :
 

Code :
  1. INSERT INTO vuesql
  2. (SELECT rpad(view_name,30,' ') , text
  3. FROM all_views 
  4. WHERE rownum = 1);


 
:D


Ouais mais nan justement, c'est la merde, parcequ'il faut qu'il recherche dans "text" des noms de champs lors d'un filtre.
Hors le LONG ne supporte pas le like.
L'idée est donc de passer le LONG en plusieurs VARCHAR2(4000) et faire des like dedans. Recopier "bêtement" d'un long vers un autre, ça sert à rien, autant faire une vue ;)

Reply

Sujets relatifs:

Leave a Replay

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