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

Oracle Discussion :

verification existence table dans bdd oracle


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Par défaut verification existence table dans bdd oracle
    Bonjour, je vous assure que j'ai rechercher sur le forum et que j'ai testé les codes des 10 pages trouvées...mais rien ne fonctionne!!
    Mon problème: je veux juste savoir si une table existe dans ma base de données oracle!!
    J'ai un formulaire demandant à l'utilisateur d'entrée le nom($NOMBDD),mdp($MDPBDD) de la base de donnée puis le nom de la table($NOMTABLE), je vérifie que le nom et mdp de la bdd sont correct(s'il y a erreur de connexion ) et je veux vérifier que la table existe pour pouvoir lancée mon traitement... je voudrais une requete sql toute simple !!!
    j'ai déjà testé des trucs comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $reqListeTable= "SELECT * FROM $NOMBDD where table_name = $NOMTABLE"; 			
    	$resultatTable = $db->query($reqListeTable);
    	$nbreRes=count($resultatTable);	
    	if($nbreRes==0)
          {echo"table existe pas!";}
          else{Mon traitement.....}
    Quelqu'un pourrait-il m'aider svp?!

  2. #2
    Membre averti
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $reqListeTable= "SELECT * FROM ".$NOMBDD." where table_name = '".$NOMTABLE."'" ; 			
    	$resultatTable = $db->query($reqListeTable);
    	$nbreRes=count($resultatTable);			
    	echo $nbreRes;
    Pourquoi lorsque je fais cette requete qu'importe si la table existe ou pas, le résultat est toujours 1?

  3. #3
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    1°) Ce n'est pas comme ça qu'on vérifie la présence d'une table dans une base de données Oracle.

    2°) Je suis étonné que votre requête retourne autre chose qu'une erreur... D'ailleurs la valeur 1 ne serait-elle pas plutôt un code erreur ?

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Par défaut
    Citation Envoyé par ojo77 Voir le message
    1°) Ce n'est pas comme ça qu'on vérifie la présence d'une table dans une base de données Oracle.

    2°) Je suis étonné que votre requête retourne autre chose qu'une erreur... D'ailleurs la valeur 1 ne serait-elle pas plutôt un code erreur ?
    je ne sais pas pourquoi ça me retourne 1!! et je ne sais pas non plus si c'est la bonne manière de faire! d'où mon poste! J'ai testé pas mal de trucs, j'ai posté un exemple de ce que j'avais testé!!
    As-tu la bonne manière de faire?

  5. #5
    Membre expérimenté
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Par défaut
    Bonjour,
    personnellement je me suis créé une petite fonction SQL qui renvoie 1 ou null
    si la table existe (1) ou non (null):

    mon objectif étais de créer dess fonction de remplacement des fonction MySQL telle que DROP/CREATE IF EXIST ou IF NOT EXIST ...

    donc pour une table (mais cela marche aussi avec les trigger, suffit d'adapter la fonction) :
    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 table_exist(nom_table IN varchar)
    RETURN number
    IS 
    temp varchar(50);
    BEGIN
    SELECT TABLE_NAME into temp from ALL_TABLES WHERE TABLE_NAME=upper(nom_table);
    IF temp IS NOT NULL THEN
    RETURN(1);
    END IF;
    END
    pour l'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select table_exist('nonTable') from dual

  6. #6
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    La liste des tables est stockée dans la vue DBA_TABLES

    D'autre part, en relisant votre message je pense que vous confondez les notions de schémas et de base de données qui au passage ne sont paqs forcément claire chez Oracle.

    Donc, si je ne me trompe pas dans mon assertion la requête devrait ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM DBA_TABLES where table_name = <NOMTABLE> AND owner = <NOMBDD> ;
    Sachant que les signes < et > ne sont pas à prendre en compte en tant que tel mais qu'ils indiquent le nom de votre variable

  7. #7
    Membre averti
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $reqListeTable= "SELECT * FROM DBA_TABLES WHERE table_name = kjglif AND owner = astre ;" ; 			
    	$resultatTable = $db->query($reqListeTable);
    	$nbreRes=count($resultatTable);			
    	echo $nbreRes;
    J'ai testé avec ou sans quotes, avec le nom de la table correct et pas correct, ça m'affiche toujours 1... le nom de ma base est bien astre(je le rentre en dur pour le test, et + tard je le remplacerais par $nombdd)

  8. #8
    Membre expérimenté
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Par défaut
    Citation Envoyé par flokent7 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $reqListeTable= "SELECT * FROM ".$NOMBDD." where table_name = '".$NOMTABLE."'" ; 			
    	$resultatTable = $db->query($reqListeTable);
    	$nbreRes=count($resultatTable);			
    	echo $nbreRes;
    Pourquoi lorsque je fais cette requete qu'importe si la table existe ou pas, le résultat est toujours 1?
    c'est quoi exactement $NOMBDD ??
    bref,
    avec ça aussi cela peut te donner un élément de réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $query="select count(*) user_tab_columns where table_name = '" . strtoupper($tableName) . "' ";
    pour info :
    attention à la casse/CASSE avec ORACLE qui met tout en majuscule... si tu entoures PAS avec ta variable des double quotes

    donc si tu testes tes tables, soit faut intégrer :
    strtoupper("table_en_minuscule_ou_pas")
    ou directement
    TABLE_EN_MAJUSCULE

    cela fait parti des bonheur du SQL avec d'ORACLE
    bref, à tester avec ' ou " maj ou min

  9. #9
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Je ne suis pas entièrement d'accord avec votre dernière remarque

    Si on fait les choses comme oracle le recommande, on met des guillemets autour des noms d'objets quand on les crée et du coup, des minuscules passent sans problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL> create table "toto" as select * from dual ;
     
    Table created.
     
    SQL> select table_name from dba_tables where table_name='toto' ;
     
    TABLE_NAME
    ------------------------------
    toto
    Pour revenir au problème de flokent7

    La requête devrait devenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reqListeTable= "SELECT count(*) FROM DBA_TABLES where upper(table_name) = upper('".$NOMTABLE."') and upper(owner)=upper('".$NOMBDD."')" ;

  10. #10
    Membre expérimenté
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Par défaut
    @ojo
    oui votre remarque est bonne et c'est vrai le fait de mettre des " " comme préconisé résoud pas mal de chose, mais cela dépend du contexte de travail.
    Spécialement, si vous programmez du nouveau ou faite de la rénovation de code

    par exemple, je bosse sur du code PHP déjà en partie implémenté et attaquant une base MySQL (et ces cas particuliers) que je transforme pour ORACLE à l'aide d'un script... donc dans mon cas, les recommandations d'ORACLE n'ont pas été suivi car c'est du MySQL et je m'assure de la mise en MAJUSCULE...

    donc je préfère avertir pour éviter les erreurs introuvables à cause de la casse.

    ps : je me suis mal exprimé je pense mais je voulais dire comme toi :
    "toto" cela reste en minuscule alors que 'toto' passe en majuscule lorsque ORACLE l'interprête...

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    @sweetasnz:
    Il manque l'exception NO_DATA_FOUND, ce qui fait que vous ne pouvez pas utiliser votre bout de code en PL/SQL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TMP@MINILHC >exec dbms_output.put_line(table_exist('toto'))
    BEGIN dbms_output.put_line(table_exist('toto')); END;
     
    *
    ERROR at line 1:
    ORA-01403: no data found
    ORA-06512: at "TMP.TABLE_EXIST", line 6
    ORA-06512: at line 1
    Etu lieu de faire temp varchar(50) (d'ailleurs VARCHAR...), faire temp all_tables.table_name%TYPE
    Et, d'un tout autre ordre, si je peux me permettre AMHA en francais ou en anglais pour respecter la grammaire faudrait changer le nom de la fonction table_existe ou table_existsPerso je prefere laisser Oracle tout mettre en majuscule.

  12. #12
    Membre averti
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Par défaut
    Citation Envoyé par ojo77 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reqListeTable= "SELECT count(*) FROM DBA_TABLES where upper(table_name) = upper('".$NOMTABLE."') and upper(owner)=upper('".$NOMBDD."')" ;
    quand j'utilise ce code là avec un mauvais nom de table, il me dit MDB2 Error: no such table ... je me dis, super ça fonctionne sauf qu'il m'écrit ça aussi alors que le bon nom de la table est saisie...

  13. #13
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Avec quel utilisateur faites vous votre requête ?

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

Discussions similaires

  1. Suppression table dans BDD SQLite
    Par Yann_69 dans le forum SQLite
    Réponses: 1
    Dernier message: 14/07/2012, 07h59
  2. [AJAX] Listes liées et table dans bdd
    Par Sergio_zero dans le forum AJAX
    Réponses: 15
    Dernier message: 24/01/2012, 09h47
  3. vérifier si mail et pseudo existe deja dans bdd
    Par endelium dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 20/01/2012, 11h54
  4. [AC-2007] Ajout tables dans BDD dorsale
    Par fclus dans le forum Modélisation
    Réponses: 3
    Dernier message: 10/11/2011, 11h18
  5. Relation entre tables dans bdd différentes
    Par Mandotnet dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 29/03/2006, 08h03

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