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

  1. #1
    Expert confirmé
    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 : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    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.
    Kropernic

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 803
    Points
    30 803
    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 947
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  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
    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
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    Expert confirmé
    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 : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    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 ?
    Kropernic

  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
    Une réponse à 12h11, 12h12, 12h13
    On est forts!
    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
    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!
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  8. #8
    Expert confirmé
    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 : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    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.
    Kropernic

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    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