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 :

Comment créer une fonction interactive ?


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut Comment créer une fonction interactive ?
    Bonjour.

    Avec SQL Developer, on peut ouvrir et afficher un fichier contenant, par exemple, quelques dizaines d'instructions SQL (des SELECT, des UPDATE, des INSERT...) terminées par des ';'.
    On peut cliquer à un endroit du fichier et taper Ctrl-Return ou F9 pour demander l'interprétation de l'instruction sous le curseur.

    J'aimerais savoir si je peux (et comment) définir une fonction pour remplacer une requête qui tient sur plusieurs lignes par un appel de fonction sur une ligne.

    Je voudrais par exemple remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select 'foobar' from dual;
    par
    avec, quelque part (dans le même ou un autre fichier), la définition de la fonction "my_foobar" sous une forme comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create or replace 
    PROCEDURE foo_bar()
    IS BEGIN
       select 'coucou' from dual; -- Grosse instruction SQL
    END foo_bar;
    Si c'est possible, il me manque juste la toute première marche... et après je grimpe tout seul

    Merci pour toute méta-information (c'est possible ou pas) ou toute information directe (exemple) ou indirecte (pointeur vers un tuto).

    Peut-être que ce n'est pas aussi simple qu'en lisp!

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Et pourquoi pas simplement créer des vues ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Et pourquoi pas simplement créer des vues ?
    Hmmm... je n'ai jamais créé de vue (je n'ai fait que du SQL "de base"... (sans jeu de mot!)), mais, pour le peu que j'en sais, ça pourrait effectivement répondre à mon besoin... au moins pour les "select". Juste à titre indicatif, est-ce que ça 'marcherait' aussi pour les "delete" et les "insert"?

    Mais j'ai surtout un autre petit souci: en fait, je suis connecté sur la base de prod (via un vpn) et je ne sais pas si j'ai le droit de créer une vue...
    J'imagine qu'une telle création ne devrait pas modifier les performances de la base (ce n'est pas comme un index), non?

    À l'heure actuelle, le mieux que j'aie trouvé, ce sont des "define", par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    define the_truc_id = 12345; -- au début du fichier
     
    select machin.id as id, machin.f1 as F1, truc.f2 as F2
    from machin, truc
    where truc.machin_id = machin.id
    and truc.id = &the_truc_id; -- et des dizaines d'autres requêtes du même genre (parfois sur une trentaine de lignes (à cause des "decode"))
    J'imagine que la "variable" the_truc_id est "locale" à ma session SQL developer, non?
    Est-ce qu'une vue peut aussi être "locale", c'est-à-dire non partagée par les autres utilisateurs?

    À l'heure actuelle, je fais du copier/coller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select machin.id as id from machin, truc where truc.machin_id = machin.id and truc.id = &the_truc_id;
     
    define the_machin_id = /* copier/coller le résultat de la ligne précédente */;
    Y a-t-il possibilité de "stocker" le résultat d'un "select" dans une "variable", quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    define the_machin_id = $(select machin.id as id from machin, truc where truc.machin_id = machin.id and truc.id = &the_truc_id);
    Veuillez me pardonner si je dis des hénormités...

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Y a-t-il possibilité de "stocker" le résultat d'un "select" dans une "variable", quelque chose comme
    Dans SQL*Plus avec "column col1 New_Value _col1" ou variable de substitution et block PL/SQL.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Dans SQL*Plus avec "column col1 New_Value _col1" ou variable de substitution et block PL/SQL.
    Merci pour la réponse.
    Je n'ai pas tout compris.
    Je vérifierai après les vacances si j'ai les droits pour installer SQL*Plus

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    New_Value et variable de substitution
    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
    21
    22
    23
    24
    25
    26
    27
     
    Connecté à :
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    SQL> column deptno new_value dno
    SQL> select deptno
      2    from dept
      3   where dname = 'SALES'
      4  /
     
        DEPTNO
    ----------
            30
     
    SQL> def dno
    DEFINE DNO             =         30 (NUMBER)
    SQL> select count(*)
      2    from emp
      3   where deptno = &dno
      4  /
    ancien   3 :  where deptno = &dno
    nouveau   3 :  where deptno =         30
     
      COUNT(*)
    ----------
             6
    Variable host (et non pas de substitution) et PL/SQL
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Connecté à :
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    SQL> variable dno number
    SQL> begin
      2    select deptno
      3      into :dno
      4      from dept
      5     where dname = 'SALES';
      6  end;
      7  /
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> print dno
     
           DNO
    ----------
            30
     
    SQL> select count(*)
      2    from emp
      3   where deptno = :dno
      4  /
     
      COUNT(*)
    ----------
             6

Discussions similaires

  1. Comment créer une fonction qui retourne un tableau?
    Par Dereck07 dans le forum Delphi
    Réponses: 4
    Dernier message: 26/04/2007, 13h16
  2. comment créer une fonction dans un activex
    Par barhoom dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 11/03/2007, 18h19
  3. Réponses: 9
    Dernier message: 22/02/2007, 14h51
  4. comment créer une fonction et la déclancher a chaque jour
    Par G_Kill dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 19/12/2006, 18h02

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