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

Administration Oracle Discussion :

Débinder un SELECT?


Sujet :

Administration Oracle

  1. #1
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut Débinder un SELECT?
    Salut,

    Est-il possible de forcer une requête avec des bind variables à se débinder?

    Exemple : transformer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT col1, col 2 FROM tab1 WHERE col3 = :var1;
    en
    SELECT col1, col 2 FROM tab1 WHERE col3 = 5;
    Quelle est l'utilité? Un logiciel tiers envoie un SELECT avec une bind variable dont la valeur est devenue obsolète (exemple d'un code TVA qui a changé) et aucune correction n'est prévue dans l'immédiat.
    Ce que je voudrais, plutôt qu'ajouter une colonne dans une table, changer mes programmes, c'est utiliser DBMS_ADVANCED_REWRITE pour intercepter l'ordre SQL et le remplacer par un autre avec la bonne valeur.
    MAIS, il y a toujours un mais, DBMS_ADVANCED_REWRITE ne gère pas les bind variables... d'où ma question.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    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 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Allez, je l'ose : "débinder", ça me fait débander de voir un tel franglais !

    Faut-il comprendre entre les lignes qu'Oracle persiste à utiliser un plan d'exécution défavorable ?
    Depuis Oracle 11g, c'est censé ne plus arriver, hormis ponctuellement, grâce au mécanisme du partage de curseurs adaptatif, qui est automatiquement en vigueur.

    Si une requête bien identifiée est en cause, je tenterais alors de la purger du cache SQL, de sorte qu'elle soit réanalysée (hard parse) et prenne en compte la bonne valeur de liaison.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec dbms_shared_pool.purge(...)
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  3. #3
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Merci pour la réponse mais le plan d'exécution n'est pas le coeur du problème.
    Le problème est qu'on reçoit un ordre SQL non modifiable avec, en variable, une valeur devenue obsolète... --> le SELECT renvoie désormais 0 enregistrements.

    L'objectif est de remplacer ce SELECT par un autre, pas de changer son plan d'exécution.
    C'est une question théorique mais bon, ça me trotte dans la tête depuis quelques temps.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  4. #4
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Bon, visiblement ce n'est pas possible...
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    Membre actif
    Inscrit en
    Janvier 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 135
    Points : 234
    Points
    234
    Par défaut
    Voir ce document:

    Using DBMS_ADVANCED_REWRITE When Binds Are Present (Avoiding ORA-30353) (Doc ID 392214.1)

    "To accomplish this, use DBMS_ADVANCED_REWRITE to rewrite the sql statement without specifying the where clause and use REWRITE_MODE=>'GENERAL'."

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Houla, je regarde ça ce week-end!
    Un gros gros merci
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  7. #7
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    A nouveau merci pour le lien mais, après lecture, cela ne correspond pas à mon besoin.

    Je veux remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT col1 FROM t1 WHERE id_col2 = :bind; --> renvoit 1 row
    avec bind valant 10 par 
    SELECT col1 FROM t1 WHERE id_col2 = 12; --> renvoit 1 row
    le lien propose, si j'ai bien compris, de supprimer la clause WHERE et remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT col1 FROM t1 WHERE id_col2 = :bind;
    par 
    SELECT col1 FROM t1; --> renvoit 1000 rows
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  8. #8
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Pour en revenir au problème initial, on peut renommer la table et mettre une vue dessus qui modifierait la valeur.
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  9. #9
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Hum, il faudra que je regarde ça

    Et tiens, pourquoi pas un trigger? Tu m'as donné des idées Franck!
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

Discussions similaires

  1. Multi-selection dans une ComboBox ?
    Par Moloko dans le forum MFC
    Réponses: 5
    Dernier message: 07/07/2021, 17h26
  2. [VB6] [Crystal] Selection enregistrement
    Par littlecow dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 11/01/2005, 13h08
  3. SELECT
    Par Thomad dans le forum SQL
    Réponses: 2
    Dernier message: 13/03/2003, 20h56
  4. TEdit : selection du texte et autre fonction
    Par Odulo dans le forum Composants VCL
    Réponses: 5
    Dernier message: 01/08/2002, 14h27
  5. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 10h44

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