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 :

CREATE INDEX dans un bloc IF ou EXCEPTION


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut CREATE INDEX dans un bloc IF ou EXCEPTION
    Hello à tous,

    Habitué au T-SQL (j'ai administré des serveurs MS-SQL et développé en T-SQL pendant des années), je débute avec le PL/SQL.

    Je suis en train d'écrire un script qui devra vérifier la présence d'un index spatial et le créer s'il n'existe pas encore.

    Voici où j'en suis :
    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
    DECLARE FEATURE_NAME VARCHAR2(100);        INDEX_EXISTS INTEGER;
    BEGIN
      --W_AANSLUITNG_LN
      FEATURE_NAME := 'W_AANSLUITNG_LN';
      INDEX_EXISTS := 0;
      BEGIN
        SELECT  1 INTO INDEX_EXISTS
        FROM    USER_INDEXES T INNER JOIN USER_IND_COLUMNS C ON  T.INDEX_NAME = C.INDEX_NAME AND T.TABLE_NAME = C.TABLE_NAME WHERE   T.TABLE_NAME = 'B$' || FEATURE_NAME
            AND T.INDEX_TYPE = 'DOMAIN' AND T.ITYP_NAME = 'SPATIAL_INDEX' AND C.COLUMN_NAME = 'G3E_GEOMETRY';
     
        EXCEPTION 
        WHEN NO_DATA_FOUND THEN
          SYS.DBMS_OUTPUT.PUT_LINE('CREATE INDEX FOR ' || FEATURE_NAME);
      END;
     
      IF INDEX_EXISTS = 1 THEN
        SYS.DBMS_OUTPUT.PUT_LINE('INDEX ALREADY EXISTS FOR ' || FEATURE_NAME); 
      END IF;
     
    END;
    Ceci fonctionne très bien mais bien sûr, à part un output dans le dbms, ça ne fait rien. L'idée était donc de remplacer l'output dans le bloc d'exception par l'instruction CREATE INDEX qui va bien. Mais ce n'est apparemment pas permis.
    J'ai voulu ruser en assignant 0 à ma variable dans le bloc d'exception (même si elle vaut déjà 0 normalement) et faire le CREATE INDEX dans la branche ELSE du bloc IF mais ce n'est pas permis non plus.

    Je viens donc chercher un peu d'aide face à ce problème qui, je pense, ne devrait pas être compliqué pour un DBA oracle averti.

    Bien sûr, ce petit bout de script va être dupliqué quelques fois car cette vérification/création doit être faite pour 17 tables. L'idée étant donc d'avoir 1 script qui fait tout d'un coup plutôt que devoir tout faire manuellement et risquer de se tromper.

    Merci d'avance pour les suggestions.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    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 135
    Par défaut
    Rien ne t'interdit d'effectuer la création d'index avec du SQL dynamique et la commande EXECUTE IMMEDIATE.
    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é
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Il faut créer l'index avec EXECUTE IMMEDIATE

  4. #4
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    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 : 2 005
    Par défaut
    A priori il faut que tu fasses du SQL Dynamique avec la commande EXECUTE IMMEDIATE car, par défaut, Oracle interdit les ordres DDL en PL/SQL sauf si SQL Dynamique justement.

    Un lien Oracle : https://docs.oracle.com/database/121...htm#LNPLS01317

    Attention, de souvenir, il ne faut pas mettre de ; dans la variable VARCHAR2 contenant l'ordre SQL à créer.

    [EDIT]
    Un bon lien : https://oracle.developpez.com/faq/?p...n-block-PL-SQL

  5. #5
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Ah bin voilà ! Je savais bien que ça allait être vite résolu si un/des oracleux (oracliens?) passaient par ici.

    Merci les gars

    Sinon, je viens de voir une méthode qui consiste (mais toujours avec du execute immediate) à directement faire la création d'index et voir si oracle râle en disant que ça existe déjà.

    Perso, j'ai l'impression que ma méthode est plus propre.

    Qu'en pensez-vous ?

  6. #6
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    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 : 2 005
    Par défaut
    Une réponse à 12h11, 12h12, 12h13
    On est forts!

  7. #7
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    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 : 2 005
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Sinon, je viens de voir une méthode qui consiste (mais toujours avec du execute immediate) à directement faire la création d'index et voir si oracle râle en disant que ça existe déjà.
    Perso, j'ai l'impression que ma méthode est plus propre.
    Qu'en pensez-vous ?
    Euh, je trouve ça bizarre et j'ai peur que ça ne cause des pbs.
    C'est un peu comme si tu fonçais avec une voiture blindée contre un mur pour tester l'airbag sans endommager la voiture...

    Si jamais tu fais ça, pense à bien bien gérer les exceptions et à les tester à fond mais cette approche ne me semble pas très propre et difficile à expliquer à ton chef, s'il est non informaticien et non "joueur"

    Perso j'éviterai!

  8. #8
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    C'est bien ce qu'il me semblait aussi. On est donc d'accord qu'il vaut mieux tester d'abord s'il existe comme je le fais.

    J'ai beau débarqué dans le monde oracle, ça me semblait quand même gros.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    En vrai ça ne change pas grand'chose.

    Ça dépend surtout de l'utilisation du script. S'il tourne tous les jours sur la même table, il y a fort à parier qu'à 99% du temps l'index existera déjà et donc ça vaut le coup de regarder s'il existe.
    A contrario, pour des travaux automatisés plus "one-shot", on a une bonne probabilité que l'index n'existe pas et autant tenter la création.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/07/2016, 16h06
  2. Gestion exception (retourner dans le bloc try)
    Par hotman1313 dans le forum Langage
    Réponses: 6
    Dernier message: 14/10/2014, 10h03
  3. Utiliser les index de listes déroulantes dans un bloc séparé ?
    Par debie1108 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/05/2007, 08h43
  4. Réponses: 8
    Dernier message: 28/04/2004, 16h53
  5. Réponses: 5
    Dernier message: 21/04/2004, 11h43

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