IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Conversion SELECT sql - pl/sql [Débutant(e)]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut Conversion SELECT sql - pl/sql
    Salut tout le monde

    Je viens de début en Oracle, sql plus et pl/sql.
    Je dois travailler sur un projet .net/c# et Oracle.
    Mais je me dit que je pourrais me simplifier la vie avec pl/sql.
    Si il y a quelque chose que j'ai retenu dans mes cours de BDD (il y en un bon moments), c'est qu'il ne faut pas réinventer la roue.

    Vu qu'hier je ne connaissais pas l'existence de pl/sql je veux y aller molo

    Ma question est simple :

    J'ai ce code en C#
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    OracleDataReader dr = _myconnection.Execute("select * from MA_TABLE where num="00001");

    Comment je peux convertir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from MA_TABLE where num="00001"
    en pl/sql ? Il me faut un return.

    Je sais que ce code n'a pas d’intérêt en soit, mais il m'aidera à mieux comprendre les choses.

    S'il vous manque des infos, je suis là.

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par rockley Voir le message
    ...Je sais que ce code n'a pas d’intérêt en soit, mais il m'aidera à mieux comprendre les choses.
    Le PL/SQL sert à faire des traitements dans la base, c'est à dire des calculs et des modifications de données selon des algorithmes plus ou moins complexes.
    Le PL/SQL n'est pas un substitut au SQL ; il englobe le SQL (par exemple des SELECT).

    Si tout ce qu'il vous faut, c'est ramener des données vers le client, alors il n'y a aucun besoin de PL/SQL pour ça. Votre simple SELECT est suffisant.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Après ça peut être intéressant de centraliser toutes les commandes SQL dans des Packages PL/SQL.
    Exemple d'une procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> create table emp as select * from scott.emp;
     
    Table created.
     
    SQL> create or replace procedure p (c out sys_refcursor) as
      2  begin
      3    open c for select ename from emp;
      4  end;
      5  /
     
    Procedure created.
    Appel de la procédure en sqlplus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    SQL> var rc refcursor
    SQL> exec p(:rc);
     
    PL/SQL procedure successfully completed.
     
    SQL> print :rc
     
    ENAME
    ----------
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    Pour appeler la procédure en .NET faut regarder dans la doc (moi j'y connais rien):
    Oracle® Data Provider for .NET Developer's Guide
    Oracle® Database 2 Day + .NET Developer's Guide (chapitre 6)

    Il doit exister plein d'autres ressources sur internet

  4. #4
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    Je me disais bien que ma demande ne vous parlerez pas.

    Je vais être plus précis sur ce que je dois faire.

    Pour le moments j'ai ça dans mon visul studio
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    OracleDataReader dr = _myconnection.Execute("select * from MA_TABLE");
    while (dr.Read())
       res.Add(new ITEM(dr));
    return res;
    avec
    res = Arraylist
    ITEM = objet contenant une ligne DR.

    Donc là je me retrouve avec une arraylist de plusieurs centaines de milliers d'enregistrements.

    Pour chaque ITEM (nom, prenom, numCli, ...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    OracleDataReader dr2 = _myconnection.Execute("select * from MA_TABLE2 where numCli="+res.ITEM.numCli);
        while (dr2.Read())
          res2.Add(new ITEM2(dr2));
        return res2;
    Là j'ai chargé "MA_TABLE", pour chaque ligne de "MA_TABLE", je charge "MA_TABLE2" (res2 est un arraylist également contenant max 500 enregistrements).

    Et pour chaque enregistrement de res2 je dois faire des INSERT ou des UPDATE.

    Le programme prend un temps phénoménale pour s’exécuter et je me disais qu'en faisant plus de chose côté oracle (vu que c'est super optimisé) je pourrais gagne en temps et en efficacité.

    Es-ce qu'PL/SQL peut répondre à ma problématique ?

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Citation Envoyé par rockley Voir le message
    Et pour chaque enregistrement de res2 je dois faire des INSERT ou des UPDATE.
    C'est plutôt le SQL qui peut t'aider.
    Regarde du côté de MERGE

  6. #6
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    Avant tout merci pour vos réponses pour vos réponses.

    Ce n'est pas si simple que ça en fait.

    Pour chaque ligne lu dans MA_TABLE je dois savoir si ces données existent dans
    MA_TABLE2 (En faite MA_TABLE2 désigne plusieurs tables différentes, j'ai simplifié pour l'exemple). J'ai besoins de faire des tests sur plusieurs valeurs dans MA_TABLE pour définir dans quel table lire et/ou dans quel table écrire...

    Il me faut des "IF" ou des équivalents.

    Je dois faire une fiabilisation des informations de MA_TABLE2.
    C'est très complexe à expliquer, mais MERGE n'est pas la bonne solution pour moi.

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Tu peux faire tout ça en plsql (lecture d'une table et actions diverses suivant les données récupérées). Tu n'as pas besoin d'avoir un retour vers ton client.

    exemple de pseudocode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure P_XXX (p_num in varchar2)
    IS
    BEGIN
     FOR r in (SELECT * FROM MA_TABLE WHERE num=p_num)
    loop
      IF r.col1 = 'TABLE2' THEN
       INSERT INTO XXX VALUES...;
      ELSIF r.col1 = 'UPD' THEN
      UPDATE ....
    END IF;
    end loop;
    COMMIT;
    end;

  8. #8
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par rockley Voir le message
    Et pour chaque enregistrement de res2 je dois faire des INSERT ou des UPDATE.

    Le programme prend un temps phénoménale pour s’exécuter et je me disais qu'en faisant plus de chose côté oracle (vu que c'est super optimisé) je pourrais gagne en temps et en efficacité.

    Es-ce qu'PL/SQL peut répondre à ma problématique ?
    Lorsque votre programme est en train de tourner faites le select suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select sql_text, executions
    from v$sql
    where executions <= 2;
    J'ai de fortes raisons de penser que vos intructions Oracle s'y trouveront en grande quantité.

    Le select ci-dessus montre toutes les instructions 'SQL' qui ne sont pas partagées ou, si on veut, non re-exécutées. Ceci a pour conséquence de remplir la mémoire SGA (shared library) et d'occasioner beaucoup de ''hard parse''. Tout cela vient de la non utilisation des bind variables ce qui est fort probable lorsqu'on utilise des selects directement sur la partie cliente

    Pour vous prémunir de ce problème, utilisez du PL/SQL statique; c'est à dire des procédures stockées ne contenant pas du SQL dynamique. Ainsi, à partir de .Net vous n'auriez qu'un seul soucis à gérer : appeler la procédure stockée en utilisant des paramètres (bind variables). Tout ce qui se trouvera à l'intérieur de la procédure stockée sera ''auto bindé'' pour vous

  9. #9
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    Tu n'as pas besoin d'avoir un retour vers ton client.
    C'est surtout pour gérer les logs.

    Si en lançant mes traitements je peux remplir des fichiers de logs sur mon C:/
    je n'ai effectivement pas besoin de retour.


    Mohamed.Houri j'ai pas bien compris ton poste .
    Comme je le disais plus haut, j'ai découvert l’existence de PL/SQL ce matin et pour le moments, ma compréhension est proche de .
    Je débute en ORACLE, alors que toi t'es un peu

    Le projet n'est pas totalement fini mais d'après mes calcules ça prend plus d'une semaine de traitement pour tout faire, et 90% du temps est passé en gestion d'arraylist.
    Pour le moment j'étudie ce tuto
    http://sheikyerbouti.developpez.com/pl_sql/


    Merci à tous les intervenant pour l'aide apporté.
    Le plus important, c'est que j'ai eu confirmation de votre part que le projet peut être réalisé en grande partie en PL/SQL.

    Je pense revenir vers vous plus tard sur des points plus précis touchant au code, et je met cette discussion en résolu.

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Garde à l'esprit qu'il faut faire le plus de chose possible en SQL et, quand ça n'est pas possible, utiliser les collections (cf chapitre 5 du Guide)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/02/2008, 11h58
  2. select selectif dans SQL
    Par pschmidtke dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/07/2006, 11h59
  3. List Select et requete SQL
    Par vincedjs dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 24/02/2006, 20h00
  4. Conversion d'une requête SQL en VBA
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 26/10/2004, 17h33
  5. Conversion de SQL à Transact-SQL
    Par sebioni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/07/2003, 11h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo