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

SQL Oracle Discussion :

Comment paramétrer une requête ? [12c]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Database
    Inscrit en
    Juin 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Database

    Informations forums :
    Inscription : Juin 2010
    Messages : 125
    Par défaut Comment paramétrer une requête ?
    Bonjour,

    J’aurai besoin d’aide pour une requête paramétrée.

    J'ai d'un côté une requête très basique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT empno, nom, prenom
    FROM Employe 
    WHERE date_embauche = [date_paramétrée]
    De l'autre une fonction retournant le dernier jour du trimestre précédent. Par ex : aujourd’hui il retourne : 31-Dec-19

    Le but étant de passer le résultat de cette fonction comme paramètre de ma requête.

    Comment automatiser ce concept ? Est-ce que je suis obligé de passer par le PL/SQL ?

    Merci pour vos réponses

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Bonjour,

    Si ta fonction est publique alors pas de problème pour l'appeler directement si as les droits d'exécution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT empno, nom, prenom
    FROM Employe 
    WHERE date_embauche = ta_fonction

  3. #3
    Membre confirmé
    Femme Profil pro
    Database
    Inscrit en
    Juin 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Database

    Informations forums :
    Inscription : Juin 2010
    Messages : 125
    Par défaut
    Oui, elle est public.

    J'ai tester en l'appelant directement mais cela ralentit l'exécution de la requête (sauf erreur de ma part, si on l'apelle directement, elle sera executée pour toute les lignes de la tables retournés)

    C'est pour cela que je cherche une autre solution

  4. #4
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Bonjour,

    Il faut voir comment est fait votre fonction. Est-ce qu'elle contient des paramètres permettant un filtre, est-ce qu'elle parcours automatique toute(s) une/des table(s), la volumétrie ect ect

    Donc soit l'optimiser si possible, soit s'en passer si possible

    Après oui, le temps d'exécution sera forcement plus grand...

    Bisous bisous

  5. #5
    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
    Si c'est dans la condition where, elle ne sera appelée qu'une seule fois
    Si c'est dans le select, elle sera appelée plusieurs fois.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Si comme tu le dis la fonction ne ramène que le dernier jour du trimestre précédent, ça ne doit pas avoir une grande incidence. D'ailleurs tu peux simplement faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT empno, nom, prenom
    FROM Employe 
    WHERE date_embauche = trunc(sysdate, 'q')-1

  7. #7
    Membre confirmé
    Femme Profil pro
    Database
    Inscrit en
    Juin 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Database

    Informations forums :
    Inscription : Juin 2010
    Messages : 125
    Par défaut
    Merci pour vos réponses!

    JeanYvette : c'est une fonction assez basique basé sur un select :

    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
    create or replace Function getQuarterDate
    Return Date
    IS
     --DECLARE
     l_date date;
     
      BEGIN
     
      select 
      case 
          when extract(month from sysdate) BETWEEN 1 and 3 
               then '31-Dec-' || TO_char(extract(year from sysdate)-1)
          when extract(month from sysdate)BETWEEN 4 and 6
               then '31-Mar-' || TO_char(extract(year from sysdate))
          when extract(month from sysdate) BETWEEN 7 and 9
               then '30-Jun-'|| TO_char(extract(year from sysdate))
          else      '31-Sep-'|| TO_char(extract(year from sysdate)) 
      end INTO l_date
     from dual;
     
      return l_date;
      END;
    sans filtre, sans filet

    et je l'appelai au niveau du Where donc je cromprends pas pourquoi mon exécution est devenu lente...

    Je vais donc m'en passer et utiliser la fonction "trunc(sysdate, 'q')-1" comme suggéré par vanagreg (que je remercie au passage car je ne connaissais pas encore cette fonction).

    Arff, j'ai encore tant a apprendre!!

  8. #8
    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
    Bon, tant qu'on y est : revue de code

    1/ Toujours mettre un format sur une chaîne de caractère représentant une date (et je conseille de mettre les mois en numériques, un changement de NLS peut avoir des effets de bord)
    '31-Dec-' || TO_char(extract(year from sysdate)-1) => TO_DATE( '31-12-' || TO_char(extract(year from sysdate)-1), 'DD-MM-YYYY')

    2/ Pourquoi faire un SELECT FROM DUAL ? C'est gérable en plsql
    l_date := CASE ....END;

    Ca donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create or replace Function getQuarterDate
    Return Date
    IS
    BEGIN
      RETURN  case 
          when extract(month from sysdate) BETWEEN 1 and 3 then TO_DATE('31-12-' || TO_char(extract(year from sysdate)-1), 'DD-MM-YYYY')
          when extract(month from sysdate)BETWEEN 4 and 6 then TO_DATE('31-03-' || TO_char(extract(year from sysdate)), 'DD-MM-YYYY')
          when extract(month from sysdate) BETWEEN 7 and 9 then TO_DATE('30-06-'|| TO_char(extract(year from sysdate)), 'DD-MM-YYYY')
          else     TO_DATE( '31-09-'|| TO_char(extract(year from sysdate)), 'DD-MM-YYYY')
      end;
    END;

    Bien sûr ce n'est que pour info, le TRUNC(SYSDATE, 'Q')-1 est bien plus performant.

  9. #9
    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 Lagnio Voir le message
    Oui, elle est public.

    J'ai tester en l'appelant directement mais cela ralentit l'exécution de la requête (sauf erreur de ma part, si on l'apelle directement, elle sera executée pour toute les lignes de la tables retournés)

    C'est pour cela que je cherche une autre solution
    Vous devriez encapsuler l'appel à votre fonction dans un 'select function from dual' afin de bénéficier de l'effet ''scalar subquery caching''

    https://hourim.wordpress.com/2019/12...om-dual-trick/

    Bien Cordialement

  10. #10
    Membre confirmé
    Femme Profil pro
    Database
    Inscrit en
    Juin 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Database

    Informations forums :
    Inscription : Juin 2010
    Messages : 125
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Vous devriez encapsuler l'appel à votre fonction dans un 'select function from dual' afin de bénéficier de l'effet ''scalar subquery caching''
    Merci Mohamed pour cet ajout.

    J'ai prit connaissance de votre papier sur la question, c'est tres clair et vraiment tres utile.

    Cordialement

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/06/2010, 06h49
  2. Réponses: 3
    Dernier message: 16/12/2006, 12h59
  3. Réponses: 2
    Dernier message: 03/05/2006, 17h00
  4. [ADO.Net][C#/Mysql] Comment exécuter une requête paramétrée?
    Par wremacle dans le forum Accès aux données
    Réponses: 6
    Dernier message: 07/02/2006, 16h55
  5. [ADO.Net][C#/Oracle] Comment utiliser une requête paramètrée ?
    Par kaboume dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/07/2005, 14h50

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