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 :

test existence vue sous oracle


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut test existence vue sous oracle
    Bonjours, je cherche depuis quelque heures maintenant comment vérifier l'existence d'une vue sous oracle. En fait j'aimerais trouver l'équivalent de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if not(exists (select * from dbo.sysobjects where id=object_id(N'[dbo].......
    sous SQL Server.

    Si quelqu'un a une idée, un lien, une piste je suis preneur.
    Merci d'avance...

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Tu as la table ALL_VIEWS qui répertorie l'ensemble des vues disponibles...
    http://download.oracle.com/docs/cd/B...htm#REFRN20305

    Et pour avoir l'ensemble des tables du dictionnaire : SELECT * FROM dict ;

  3. #3
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut
    ok merci beaucoup du coup il me faut faire la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if not(exists (select * from ALL_VIEWS where VIEW_NAME='[V_EnCoursPersoDossier_lv_45]') then
     EXEC(Requete_Create_View);
    end if;
    J'ai un doute sur le not(exists()) mais également sur le exec, pourrais tu me dire si cela fonctionne sous oracle et si c'est pas le cas connaitrais tu l'équivalent?

    Merci .

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Pour le EXISTS je ne sais pas si ça marche, mais je pense que le plus simple est de faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF  (SELECT COUNT(*) ... )>0 THEN
    Qu'est-ce que "Requete_Create_View"? c'est une procédure PL/SQL? si oui, pas besoin du EXEC, tu tapes simplement son nom suivi d'un point-virgule.

  5. #5
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut
    Alors en fait Requete_Create_View correspond a une variable varchar(8000) dans laquelle se trouve ma requete de création de vue.
    Pour tout te dire ce code va etre généré en php puis executer sur une base oracle.

    Merci pour le test du nombre de résultat crois-tu que le exec va fonctionner?

    Merci.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Pour exécuter une requête sous forme de chaine de caractère, il faut faire du SQL dynamique, c'est à dire écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE(Requete_Create_View);
    (si tu veux plus d'infos : http://sheikyerbouti.developpez.com/..._immediate/#L3 )


    Euh par contre c'est l'ensemble de ton code qui va être généré par du php (l'ensemble du bloc "if .... exec requete etc...")??
    Ou juste ta requête Requete_Create_View qui sera passée en paramètre d'une procédure stockée?

  7. #7
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut
    en fait c'est l'ensemble qui va etre généré puis executer avec oci_execute() cela devrait fonctionner non?
    Merci beaucoup pour le execute immediate
    Par contre j'ai une erreur sur le code suivant maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ((select count(*) from ALL_VIEWS where VIEW_NAME='V_EnCoursPersoDossier_lv_45')=0) then
     EXEC(Requete_Create_View);
    end if;
    Au niveau du if il me dit que j'ai le symbole ")" alors qu'il attend un autre symbole j'arrive pas a voir ou se situe l'erreur de syntaxe la.

    Merci.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Ah oui en effet, j'ai l'impression qu'on ne peut pas tester directement la valeur de retour d'un select.... Du coup il y a la solution de déclarer un entier, faire un select into cet entier, puis tester sa valeur. Pour t'aider j'avais fait une fonction permettant de vérifier si une table existe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FUNCTION existsTable(p_tableName IN t_tableName) RETURN BOOLEAN IS
        l_nb BINARY_INTEGER;
      BEGIN
        -- on lit le nombre de tables du nom donné
        SELECT COUNT(*)
          INTO l_nb
          FROM user_tables
          WHERE table_name = p_tableName;
        RETURN l_nb>0;
      END;
    Par contre ça m'étonnerait fortement que tu puisses envoyer directement du PL/SQL via php.... Pour moi il te faut créer une procédure stockée en PL/SQL, et ensuite l'appeler depuis PHP, en lui passant éventuellement en paramètre ta requête Requete_Create_View (qui doit être une requête SQL et non un programme PL/SQL).
    Enfin à confirmer avec des gens qui connaissent mieux que moi.

  9. #9
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut
    Dans ce cas est ce qu'il n'est pas possible d'effectuer la même chose en SQL directement sur une base Oracle?

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE UPPER(table_name) = UPPER(p_tableName);
    pour éviter les problèmes de casse

    Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FUNCTION existsTable(p_tableName IN t_tableName) RETURN BOOLEAN IS
        l_nb BINARY_INTEGER;
      BEGIN
        -- on lit le nombre de tables du nom donné
        SELECT 1 
          INTO l_nb
          FROM DUAL WHERE EXISTS (
          FROM user_tables
          WHERE UPPER(table_name) = UPPER(p_tableName));
        RETURN TRUE;
    EXCEPTION 
      WHEN NO_DATA_FOUND THEN RETURN FALSE;
      END;
    Si on veut faire plus joli

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par locs Voir le message
    Dans ce cas est ce qu'il n'est pas possible d'effectuer la même chose en SQL directement sur une base Oracle?
    bien sûr, il suffit de récupérer le résultat de la requête

  12. #12
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut
    je viens de lire ta reponse orafrance par contre je ne comprend pas un point quand tu me dit récupérer le résultat de ma requete.
    Lorsque j'execute :
    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
     
     
    DECLARE
    Requete_Create_View VARCHAR2(8000);
    BEGIN
    Requete_Create_View :='
    CREATE VIEW V_EnCoursPersoDossier_lv_45
    AS
    ......
    ';
     
    if (select count(*) from ALL_VIEWS where VIEW_NAME='V_EnCoursPersoDossier_lv_45')=0 then
     EXECUTE IMMEDIATE(Requete_Create_View);
    end if;
    END;
    j'ai une erreur au niveau du select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (select count(*) from ALL_VIEWS where VIEW_NAME='V_EnCoursPersoDossier_lv_45')=0 then
        *
    ERREUR à la ligne 95 :
    ORA-06550: Ligne 95, colonne 5 :
    PLS-00103: Symbole "SELECT" rencontré à la place d'un des symboles suivants :
    ( - + case mod new not null others <an identifier>
    Je précise juste que j'execute ce code dans SQL*Plus worksheet.

    Merci pour votre aide en tout cas, ca fait plaisir de pas se sentir seul

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    locs > si tu ne veux pas faire de procédure stockée, je pense qu'il te faut faire ton "if" directement en php. Tu envoies une première requête qui te récupère le nombre de vues portant le nom que tu veux, puis tu testes sa valeur en php et tu lances ta deuxième requête si elle vaut 0...
    Enfin comme je t'ai dit il faut confirmer que tu ne peux pas envoyer directement du pl/sql via php, mais ça m'étonnerait que tu puisses.

    orafrance > ok pour le upper
    et dans ta requête, il ne manque pas un deuxième SELECT après ton EXISTS? :-/
    Je pige pas en quoi c'est plus joli comme solution? (c'est pas une critique hein, c'est juste que ça me parait plus compliqué sans apporter de valeur ajoutée??)

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    locs, inspire toi de ce que j'ai fait pour tester l'existence d'une table : tu ne mets pas le select à l'intérieur de ton if, mais tu écris son résultat dans un entier que tu testes ensuite.

    Mais bon, ce n'est pas parce que tu arriveras à le faire marcher sous sql plus que tu pourras l'exécuter depuis php! tu n'as pas possibilité de créer une procédure stockée?

  15. #15
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut
    Le plus simple dans mon cas serait de le faire fonctionner sans procédure stocke. Je dois adapter tout mes script qui fonctionne avec une base SQL Server pour les faire fonctionner avec une base Oracle. J'ai pas mal de taff déjà au niveau de mes requêtes SQL, c'est pourquoi je préférerais éviter d'avoir a modifier mes script php en plus.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Tes requêtes sont bien écrites dans PHP? du coup pour modifier tes requêtes tu es obligé de toucher ton code php....

    Bon enfin si tu ne veux pas de procédure stockée, il faut que tu commences par envoyer une requête qui te compte le nombre de vues du nom que tu veux. Puis en php, tu testes cette valeur, et si elle vaut 0 tu envoies ta deuxième requête.

    Je ne pense pas que tu puisses tout faire en une étape sans passer par des procédures stockées.

  17. #17
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut
    ok ok tu as raison je vais faire ce que tu as dis cela me semble le plus simple.
    Merci beaucoup pour votre aide.

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

Discussions similaires

  1. Optimisation des vues SQL sous Oracle
    Par ammah dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/02/2010, 17h01
  2. la clause IF EXISTS sous Oracle
    Par kmezine dans le forum Oracle
    Réponses: 2
    Dernier message: 30/09/2009, 17h50
  3. Existe t'il un defncopy sous oracle [10.2] ?
    Par Romane dans le forum Outils
    Réponses: 2
    Dernier message: 23/04/2009, 10h30
  4. Récupérer les noms des vues sous Oracle
    Par Remedy dans le forum SQL
    Réponses: 10
    Dernier message: 07/12/2007, 18h22
  5. [DEBUTANT] IF EXISTS sous oracle
    Par tripper.dim dans le forum SQL
    Réponses: 2
    Dernier message: 18/05/2007, 11h12

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