[SQL][Oracle] Faire des boucles
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

[SQL][Oracle] Faire des boucles



  1. #1
    sigh

    [SQL][Oracle] Faire des boucles


    ------

    Bonjour

    J'ai appris le SQL sur le tas et bien que mon chef n'estime pas nécessaire que je suive une formation, la frustration est grande quand je bloque... J'ai cherché sur plusieurs sites mais ne trouve pas mon bonheur. Je ne peux pas vraiment donner de code que j'ai déjà écrit (question de confidentialité basique) mais vu que je "m'apprends en solo", je n'ai pas forcément confiance dans mes tentatives (pour le moment toutes soldées avec pléthore d'erreurs Oracle).

    Une bonne âme peut-elle m'aider à capter comment faire des boucles type "for" ou "until" en SQL ? Je comprends la logique en pseudo-code mais je n'arrive pas à l'écrire en SQL...

    D'avance, merci pour votre aide

    -----

  2. #2
    umfred

    Re : [SQL][Oracle] Faire des boucles

    As-tu vraiment besoin de faire des boucles ?
    sinon regarde par là pour "un cours" https://www.oracletutorial.com/plsql...rsor-for-loop/

    Si tu peux donner un exemple simple pour comprendre le besoin (tu peux anonymiser en renommant tes colonnes (colA_id, colB_nom, colC_entier, ..) et tes donnés si nécessaire)

  3. #3
    pm42

    Re : [SQL][Oracle] Faire des boucles

    Il n'y a pas de boucles en SQL. Si tu ne sais pas ça, tu as effectivement besoin d'une formation ce qui serait la moi dire des choses.

    Les bases de données proposent quasiment toutes un langage propriétaire qui permet de programmer de façon classique mais on ne les utilise que s'il n'y pas d'autre solution.

  4. #4
    sighing

    Re : [SQL][Oracle] Faire des boucles

    Pardon pour la multiplication de comptes, il semble qu'il y ait des pépins que je suis en train de voir avec la modération...

    Je ne sais pas si ça sera très clair mais voici une dernière mouture où j'échoue à obtenir la liste des identifiants avec tout à zéro.

    declare
    id_tab t1.ni1%type;
    test_doc varchar(16);
    begin
    for id_mvt in
    (select ni1 from t1 m left join t2 on t1.ni2 = t2.ni2 where t2.lib like 'AAA%' and 1.statut = 9)
    loop
    select PCK.F_DATA(id_tab.ni1) into test_ok from dual; -- le package teste la présence de certaines données en lien avec cet identifiant
    if test_ok = '0000000000000'
    then dbms_output.put_line ('NEXT');
    else dbms_output.put_line (id_tab.ni1);
    end if;
    end loop;
    end;

  5. A voir en vidéo sur Futura
  6. #5
    sighing

    Re : [SQL][Oracle] Faire des boucles

    Citation Envoyé par pm42 Voir le message
    Il n'y a pas de boucles en SQL. Si tu ne sais pas ça, tu as effectivement besoin d'une formation ce qui serait la moi dire des choses.
    Alors je ne "sais pas ça" mais je sais que des mots genre "for" etc font partie du code reconnu comme code (modalités d'exécuton) plutôt que comme "argument" (donnée injectée pour que s'ensuive une sélection, MàJ, etc).

    Citation Envoyé par pm42 Voir le message
    Les bases de données proposent quasiment toutes un langage propriétaire qui permet de programmer de façon classique mais on ne les utilise que s'il n'y pas d'autre solution.
    Jusqu'ici je ne triture que du SQL en base de type Oracle -- oui c'est une petite nuance qui peut faire la différence quant à l'écriture de cetaines requêtes, certes. Néanmoins je n'ai pas connaissance de "langage propriétaire" -- d'autant que je ne suis pas développeur, et comme nombre avant moi, j'ai plus d'une fois consulté stackoverflow and consorts (ne serait-ce que pour apprendre à faire une MàJ en multi-tables et autres cas pas-d'école difficilement(jamais?) référencé dans des cours ou tutoriels). Je suppose que certains créent leurs propres fonctons etc mais je n'ai pas cette possibilité et dois me contenter de faire mes propres requêtes et "scripts" simplounets pour traiter ce qui m'incombe.

  7. #6
    pm42

    Re : [SQL][Oracle] Faire des boucles

    Déjà, le code que tu nous as donné n'est pas du SQL mais du PL/SQL, c'est à dire justement le langage propriétaire d'oracle.
    Et à la louche, cela ressemble beaucoup à une jointure qui pourrait se faire en SQL pur.

    Mais à moins qu'un spécialiste de PL/SQL passe ce qui n'est pas le plus probable sur ce forum, on risque de ne pas pouvoir t'aider beaucoup.

  8. #7
    sigh

    Re : [SQL][Oracle] Faire des boucles

    Je tente quand même, des fois qu'un autre utilisateur d'Oracle passe parmi nous ?

    et rectification :
    Citation Envoyé par sighing Voir le message
    Je ne sais pas si ça sera très clair mais voici une dernière mouture où j'échoue à obtenir la liste des identifiants n'ayant pas tout à zéro (donc non-ok).

  9. #8
    sigh

    Re : [SQL][Oracle] Faire des boucles

    Citation Envoyé par pm42 Voir le message
    Et à la louche, cela ressemble beaucoup à une jointure qui pourrait se faire en SQL pur.Mais à moins qu'un spécialiste de PL/SQL passe ce qui n'est pas le plus probable sur ce forum, on risque de ne pas pouvoir t'aider beaucoup.
    Je précise que le package teste plein de tables (une bonne cinquantaine) pour chaque ligne/identifiant (et je parle et part de milliers d'identifiants). Pour chaque table "fille", soit je n'ai rien (ok) soit je ramène quelque chose (nok) et ça peut être une ou plusieurs lignes (nok dans tous les cas). Les identifiants "peuvent" être sélectionnés par jointure ou par imbrication, le principe étant de ramener tous les identifiants en t1 qui satisfont le critère en t2.

    Mon problème c'est : comment exécuter le package sur tous mes identifiants en t1 sans taper littéralement des milliers de requêtes ? D'où certains qui me disent "utilise une boucle" sauf qu'ils ne savent pas l'écrire et moi non plus -- et ceux qui sauraient, sont déjà overbookés jusqu'au burnout...

  10. #9
    Ikhar84
    Animateur Informatique

    Re : [SQL][Oracle] Faire des boucles

    Citation Envoyé par sighing Voir le message
    and 1.statut = 9
    D'où sort ce 1 du 1.statut ? Faute de frappe ?

    Code:
    SELECT t1.ni1 FROM t1 LEFT JOIN t2 ON t1.ni2 = t2.ni2 WHERE t2.lib LIKE 'AAA%' AND t1.statut = 9;
    D'ailleurs il y a aussi un "m" parasite ?

    Citation Envoyé par sighing Voir le message
    select ni1 from t1 m
    L'alias "m" de la table t1 n'est jamais utilisé (ce qui ne provoquera pas d'erreurs) ?

    D'ailleurs tu as un connait un moyen de logger ou tracer les erreurs ?

    C'est peut être la première chose à apprendre ?

    Sinon l'hypothèse la plus probable c'est que tu n'utilises pas le bon type de jointure...
    Dernière modification par Ikhar84 ; 10/10/2024 à 00h31.
    J'ai glissé Chef !

  11. #10
    noir_ecaille

    Re : [SQL][Oracle] Faire des boucles

    Pardon. t1.statut = 9... le m était un alias, il n'est guère important.

    Je ne sais pas logger et mes camarades d'équipe pas plus (pour ce qui concerne la partie purement base/requête). Sous SQLdev, on fait comment ?

    Pour la jointure, je peux m'en passer de manière bourrine (suffit de s'embêter à prendre tooouuus les identifiants, ou une partie) mais ça ne lance pas plus le package comme espéré quand je fais ça...
    Dernière modification par noir_ecaille ; 10/10/2024 à 02h56.

  12. #11
    umfred

    Re : [SQL][Oracle] Faire des boucles

    il me semble qu'il y a des erreurs de noms de variables
    test_doc / test_ok
    et dans la boucle, il faudrait utiliser id_mvt plutôt que ni1 (si je ne me trompe pas) vu que la boucle va parcourir les ni1 du select fourni au FOR.

  13. #12
    noir_ecaille

    Re : [SQL][Oracle] Faire des boucles

    J'avoue que j'ai anonymisé à la va-vite... Avec corrections :

    declare
    id_tab t1.ni1%type;
    test_ok varchar(16);
    begin
    for id_tab in
    (select ni1 from t1 m left join t2 on t1.ni2 = t2.ni2 where t2.lib like 'AAA%' and 1.statut = 9)
    loop
    select PCK.F_DATA(id_tab.ni1) into test_ok from dual; -- le package teste la présence de certaines données en lien avec cet identifiant
    if test_ok = '0000000000000'
    then dbms_output.put_line ('NEXT');
    else dbms_output.put_line (id_tab.ni1);
    end if;
    end loop;
    end;

    Dans un premier temps, je cherche à ce que id_tab parcourt les ni1 du select et à utiliser le ni1 correspondant pour exécuter le package.
    En deuxième temps, je teste le résultat obtenu et stocké dans test_ok : si tout n'est pas bon, je veux que ça ramène/publie tous les identifiants concernés (les autres, soit un petit commentaire genre "next", "ràs", ou même rien, parce qu'il n'y a pas d'action à prévoir dessus).

  14. #13
    umfred

    Re : [SQL][Oracle] Faire des boucles

    et tu as des messages d'erreurs ou autres ?

  15. #14
    vgondr98

    Re : [SQL][Oracle] Faire des boucles

    Sinon, les boucles, tu peux le faire dans un langage de programmation comme python ou java par exemple. Il suffit de se connecter à la base de données avec ton script, et ensuite tu récupères la liste de tes id avec une fonction, et ensuite tu itères sur cette liste pour lancer d'autres requêtes avec du sql natif. L'avantage, c'est que ton script pourra fonctionner avec des SGBD différents car tu utiliseras du SQL natif.

  16. #15
    pm42

    Re : [SQL][Oracle] Faire des boucles

    C'est juste beaucoup plus lent...

Discussions similaires

  1. Oracle
    Par invitea62344a9 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 30/06/2009, 15h15
  2. oracle 7
    Par invite22efe8b5 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 22/03/2009, 18h17