PL/SQL curseur

PL/SQL curseur - SQL/NoSQL - Programmation

Marsh Posté le 20-06-2005 à 17:21:39    

Bonjour à tous,
je tiens à préciser que je débute dans le PL/SQL!!
voila ma config:
apache 1.3
Oracle 9i
PHP 5.0 (pour le moment impossibilite de compiler avec --with-oci et --with-oracle)
 
voici ce que je veux faire:
j'ai une table commande sur laquelle je dois recuperer des valeurs (c_appli, c_cde, c_post_cde). Pour chacun de ces enregistrements, je dois vérifier si le triplet existe dans la tale facture, et s'il existe, je dois faire une maj de la table.
 
Je dispose de 2 methodes (soit passer par des fichiers, ce qui est tres couteux en temps, j'ai essayé :p)
soit je pense essayer d'ecrire un curseur dans un fichier que j'appelerai avec sqlplus.  
 
j'ai ecrit ceci:

Code :
  1. . /home/itools/profile_9i.RT
  2. sqlplus -s <<EOF
  3. usr/password@PER
  4. spool essai2
  5. DECLARE
  6. CURSOR param is
  7. select c_post_cde, c_cde, c_appli from commande where c_cd='01' and c_sa='XH'   AND c_ent='
  8. ENTRP00006' and d_cde = to_date ('10/02/2005', 'DD/MM/YYYY');
  9. var commande%TYPE;  //je suis pas sur ici, etant donné que je veux que les 3 fameuses valeurs)
  10. BEGIN
  11. OPEN param;
  12. LOOP
  13. FETCH param INTO var;
  14. select count(*) from facture AS f where f.c_appli=var.c_appli and f.c_post_cde=var.c_post_c
  15. de and f.c_c_cde= var.c_cde;
  16. //et c la que je sais pas quoi faire... style comment tester la valeur du count(*)???
  17. exit when param%NOTFOUND
  18. end loop;
  19. end;
  20. spool off
  21. EOF

 
 
 
si vous pouviez m'aider a remplir le milieu ce serait vraiment super sympa,je galere un peu la...
 
 
Merci et desole si cette question peut paraitre stupide, elle ne l'est pas pour moi :(:(


Message édité par nachi2 le 20-06-2005 à 17:59:18
Reply

Marsh Posté le 20-06-2005 à 17:21:39   

Reply

Marsh Posté le 20-06-2005 à 21:27:14    

je veux pas paraitre grotesque  
mais je pense que ça ne marchera pas!
 
le pl sql c'est pour les procédures stockées par exemple, ou les packages qui contiennent des fonctions et procédures!  
 
donc perso je te conseille de t'orienté vers cela au lieu de passé par un fichier, car tu as quand mm un sgbd qui t'offre un grand nombre de possiblité, alors merci bien, mais passé par sqlplus ça marchera jms!
 
donc tu fais une procédure stockée et tu y met ton code plsql...

Reply

Marsh Posté le 20-06-2005 à 21:40:37    

Code :
  1. CREATE PROCEDURE MaProc AS
  2. DECLARE
  3. TYPE recordcommande IS RECORD
  4. (
  5.   nom1 COMMANDE.c_post_cde%TYPE,
  6.   nom2 COMMANDE.c_cde%TYPE,
  7.   nom3 COMMANDE.c_appli%TYPE
  8. );
  9. CURSOR cur is
  10.    SELECT c_post_cde, c_cde, c_appli
  11.    FROM commande
  12.    WHERE c_cd='01'
  13.    AND c_sa='XH' 
  14.    AND c_ent= 'ENTRP00006'
  15.    AND d_cde = TO_DATE('10/02/2005', 'DD/MM/YYYY');
  16. record recordcommande%ROWTYPE;
  17. valeurcount INTEGER;
  18. BEGIN
  19.    OPEN cur;
  20.    LOOP
  21.       FETCH cur INTO record;
  22.       EXIT WHEN cur%NOTFOUND;
  23.       SELECT count(*) INTO valeurcount
  24.       FROM facture f
  25.       WHERE f.c_appli = record.nom1
  26.       AND f.c_post_cde= record.nom2
  27.       AND f.c_c_cde= record.nom3;
  28.       IF valeurcount > 0 THEN
  29.          UPDATE COMMANDE
  30.  SET ...
  31.  WHERE ...;
  32.       END IF;
  33.    END LOOP;
  34.    CLOSE cur;
  35. END;
  36. /


 
Voila tu dois t'orienté vers cela...
 
en aucun cas passé par un fichier, tu peux le faire directement par ORACLE...
 
si tu as des questions ou besoin d'aide concernant oracle, tu peux me contacté à l'adresse email suivante: laurent.bindels@swing.be
 
si tu veux également tu peux également passé des parametres a cette procédure comme si on le ferait dans une fonction du C!
il est également possible de retourné une valeur, dans ce cas la on ne fait pas une procédure mais une fonction dans un package... Voila j'espere que tu t'en sortira avec cela.
 
mais en aucun cas fait comme tu as fais, je ne pense mm pas que ça marcherait! surtout si c'est destiné a passé par le web...
faut te dire que le client qui va passé par son navigateur, il n'a pas de client oracle, donc aucune possibilité de lancé sqlplus...
pour cela tu dois gardé cela sur le serveur, d'ou la nécéssité d'avoir une procédure stockée qui va gardé la logique de ton application.
 
Ensuite il suffira simplement depuis un langage de programmation d'appelé des fonctions permettant d'exploité oracle tout simplement, perso je ne l'ai jamais fait avec php, mais ça doit existé comme pour mysql...


Message édité par moi23372 le 20-06-2005 à 21:45:42
Reply

Marsh Posté le 21-06-2005 à 09:47:21    

SAlut,
 
tout d'abord je voulais te remercier pour ton aide! c'est vraiment super sympa!
effectivement le TYPE record, j'avais pas vu ca... je connaissais juste %TYPE et %ROWTYPE! au temps pour moi.
 
bon le truc c que sqlplus est installé, et en l'occurence l'applciation est lancée depuis el serveur, où sqlplus est installé. Donc a priori en lancant depuis le shell sqlplus usr/pass@instance @curseur, ca devrait pouvoir marcher je pense...je vais aller essayer de ce pas :)
 
en tout cas vraiment merci... c pas facile quand obn commence tout juste :p
 
Nachi
PS: en passant par les fichiers, ca marche, mais c'est vraiment tres tres tres long!


Message édité par nachi2 le 21-06-2005 à 09:58:03
Reply

Marsh Posté le 21-06-2005 à 11:53:15    

Bon alors j'ai essaye ta procedure en adaptant a mes besoins
 
sqlplus -s usr/password@PER @/home/asavoy/dataware/WebTools/SQL/sacd/curseur.sql
 
Warning: Procedure created with compilation errors.
 
 
:(:(:(

Reply

Marsh Posté le 22-06-2005 à 16:24:37    

Fais voir le code de ta procédure car tu as certainement complété celle de moi23372...

Reply

Marsh Posté le 02-11-2005 à 11:11:05    


J'ai essayé de mettre en pratique les conseils donnés dans ce poste en faisant :
 

Code :
  1. DECLARE
  2. TYPE recordTypeFlux IS RECORD
  3. (
  4.    libelle type_flux.libelle_type_flux%TYPE,
  5.    code type_flux.code_type_flux%TYPE
  6. );
  7. CURSOR CurseurTypeFlux IS select libelle_type_flux, code_type_flux from type_flux;
  8. record recordTypeFlux%ROWTYPE;
  9. valeurcount INTEGER;
  10. BEGIN 
  11.     OPEN CurseurTypeFlux; 
  12.     LOOP 
  13.        FETCH CurseurTypeFlux INTO record;
  14.        EXIT WHEN CurseurTypeFlux%NOTFOUND;
  15.        insert into tmp_type_flux(tf_libelle , tf_code) values(record.libelle,record.code);
  16.     END LOOP;
  17.     CLOSE CurseurTypeFlux;
  18. END;


 
Et je me retrouve avec une erreur :  
 

Code :
  1. PL/SQL: SQL Statement ignored
  2. record recordTypeFlux%ROWTYPE;
  3.         *
  4. ERREUR à la ligne 10 :
  5. ORA-06550: Ligne 10, colonne 9 :
  6. PLS-00310: avec l'attribut %ROWTYPE, 'RECORDTYPEFLUX' doit nommer un curseur ou une table ou une variable curseur
  7. ORA-06550: Ligne 10, colonne 9 :
  8. PL/SQL: Item ignored
  9. ORA-06550: Ligne 19, colonne 35 :
  10. PLS-00320: déclaration de type de cette expression est incomplète ou mal structurée
  11. ORA-06550: Ligne 19, colonne 8 :
  12. PL/SQL: SQL Statement ignored
  13. ORA-06550: Ligne 22, colonne 78 :
  14. PLS-00320: déclaration de type de cette expression est incomplète ou mal structurée
  15. ORA-06550: Ligne 22, colonne 85 :
  16. PL/SQL: ORA-00984: Un nom de colonne n'est pas autorisé ici
  17. ORA-06550: Ligne 22, colonne 8 :
  18. PL/SQL: SQL Statement ignored

Reply

Marsh Posté le 02-11-2005 à 11:16:14    

Enlève le %ROWTYPE ...
 
Et puis utilise un autre nom de variable que RECORD (c'est un mot clé de PL/SQL).

Reply

Sujets relatifs:

Leave a Replay

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