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

SQL Oracle Discussion :

Comment savoir en SQL si une table existe dans ma base de donnees ?


Sujet :

SQL Oracle

  1. #1
    Battosaiii
    Invité(e)
    Par défaut Comment savoir en SQL si une table existe dans ma base de donnees ?
    Bonjour,

    Je suis en train de réaliser un script qui cré une table et ensuite va lancer des fichiers SQL. Ce que j'aimerais faire c'est tester qu'une table existe deja depuis mon shell unix.

    Si la table existe alors je veux ne pas créer une nouvelle table.

    Actuellement 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
     
    sqlplus -s /nolog >/dev/null  <<-EOF
    connect $SCHEMA/$SCHEMAPW
     
    set serveroutput on size 
    spool /app/sag_table.log 
     
    whenever sqlerror exit 19
     
    CREATE TABLE SAG_DATA 
    ( NDA varchar2(10),
      code varchar2(3),
      ACTIF varchar2(10),
      PASSIF varchar2(10),
      NOK VARCHAR2(1)
    );
     
    SELECT VALIDE FROM DOCUMENT ;
     
    spool off
    exit
    EOF
    J'ai l'erreur suivante :

    CREATE TABLE SAG_DATA
    *
    ERREUR à la ligne 1 :
    ORA-00955: Ce nom d'objet existe déjà

    Merci

  2. #2
    Membre expérimenté 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 : 50
    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
    Points : 1 597
    Points
    1 597
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select table_name from user_tables where table_name='SAG_DATA'

  3. #3
    Battosaiii
    Invité(e)
    Par défaut
    Merci pour ta reponse,

    Comment faire en sqlplus pour tester cette existence ?

    J'aimerais faire quelaue chose comme cela en shell unix :

    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
     
    sqlplus -s /nolog >/dev/NULL  <<-EOF
    connect $SCHEMA/$SCHEMAPW
     
    requete = SELECT table_name FROM user_tables WHERE table_name='SAG_DATA'
    if(requete == null)
    {
    CREATE TABLE SAG_DATA 
    ( NDA varchar2(10),
      code varchar2(3),
      ACTIF varchar2(10),
      PASSIF varchar2(10),
      NOK VARCHAR2(1)
    );
    }
    Comment peut on faire cela ?

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    j'aime faire ca en catchant l'exception de la table qui existe déjà

    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
       TABLE_ALREADY_EXISTS   EXCEPTION;
       PRAGMA EXCEPTION_INIT (TABLE_ALREADY_EXISTS, -955);
    BEGIN
       DBMS_OUTPUT.PUT_LINE('CREATE TABLE SAG_DATA( NDA varchar2(10),  code varchar2(3),  ACTIF varchar2(10),  PASSIF varchar2(10),  NOK VARCHAR2(1))');
       EXECUTE IMMEDIATE
          'CREATE TABLE SAG_DATA( NDA varchar2(10),  code varchar2(3),  ACTIF varchar2(10),  PASSIF varchar2(10),  NOK VARCHAR2(1))';
       DBMS_OUTPUT.PUT_LINE('TABLE CREATED');
    EXCEPTION
       WHEN TABLE_ALREADY_EXISTS
       THEN
          DBMS_OUTPUT.PUT_LINE('TABLE ALREADY EXISTS');
    END;
    /

  5. #5
    Membre actif Avatar de Ahmed AANGOUR
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Janvier 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Janvier 2010
    Messages : 139
    Points : 271
    Points
    271
    Par défaut
    tu peux appeler du code PL/SQL dans ta session sqlplus:

    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
    21
    22
    23
    24
    25
     
    SQL> drop table psg;
     
    Table dropped.
     
    SQL> declare
      2     v_exists number ;
      3  begin
      4     select count(*) into v_exists from user_tables where table_name = 'PSG';
      5     if v_exists = 0 then
      6             execute immediate 'create table PSG (num number(2), nom varchar2(50), prenom varchar2(50), poste varchar2(50))';
      7     end if;
      8
      9  end;
     10  /
     
    PL/SQL procedure successfully completed.
     
    SQL> desc psg
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     NUM                                                NUMBER(2)
     NOM                                                VARCHAR2(50)
     PRENOM                                             VARCHAR2(50)
     POSTE                                              VARCHAR2(50)

  6. #6
    Battosaiii
    Invité(e)
    Par défaut
    Merci pour ta reponse .

    J'utilise aussi spool avant pour envoyer les resultats des requetes dans un log comme tu peux le voir ci dessous. Or il n'y pas les resultats des erreurs ou des messages dans le log.

    Est ce que tu sais pourquoi ?

    J'ai ajouté ton code dans mon script comme ceci :


    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    function testSql
    {
    sqlplus -s /nolog >/dev/null  <<-EOF
    connect $SCHEMA/$SCHEMAPW
     
    set serveroutput on size 
    spool /app/sag_table.log 
     
    whenever sqlerror exit sql.sqlcode;
     
    DECLARE
       TABLE_ALREADY_EXISTS   EXCEPTION;
       PRAGMA EXCEPTION_INIT (TABLE_ALREADY_EXISTS, -955);
    BEGIN
       DBMS_OUTPUT.PUT_LINE(CREATE TABLE SAG_DATA ( 
      NDA varchar2(10),
      code varchar2(3),
      ACTIF varchar2(10),
      PASSIF varchar2(10),
      NOK VARCHAR2(1)
    );
       EXECUTE IMMEDIATE
          'CREATE TABLE SAG_DATA ( 
      NDA varchar2(10),
      code varchar2(3),
      ACTIF varchar2(10),
      PASSIF varchar2(10),
      NOK VARCHAR2(1)
    )';
       DBMS_OUTPUT.PUT_LINE('TABLE CREATED');
    EXCEPTION
       WHEN TABLE_ALREADY_EXISTS
       THEN
          DBMS_OUTPUT.PUT_LINE('TABLE ALREADY EXISTS');
    END;
     
     
     
     
    spool off
    exit
    EOF
    }
     
     
    #########################################################################################################
    #   D E B U T   P R O G R A M M E   P R I N C I P A L
    #########################################################################################################
     
    SCHEMA=$1
    SCHEMAPW=$2
     
    echo " DEBUT"
     
    testSql
     
    echo " FIN"

    Merci

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    erreurs de syntaxe

    SET serveroutput ON size 1000000

    et aussi les apostrophes après put_line

    dbms_output.put_line('...')

  8. #8
    Battosaiii
    Invité(e)
    Par défaut
    J'ai toujours des erreurs. J'ai changé complétement mon script.
    J'observe que la commande sql s'execute depuis le sqlplus mais lorsque j'execute mon shell unix il ne se passe rien. Il n'y a meme pas d'erreur !

    Le script suivant s'execute sans erreur mais la table ne se cree pas :


    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    function testSql
    {
    sqlplus -s /nolog >/dev/null  <<-EOF
    connect $SCHEMA/$SCHEMAPW
     
    SET serveroutput ON size 1000000
    spool /app/bsr/MDE1BSR/home/users/amde1bsr/sag_table.log 
     
    whenever sqlerror exit 1;
     
     
    declare
           v_exists number ;
        begin
    	   SELECT COUNT(*) INTO v_exists FROM user_tables WHERE table_name='SAG_DATA';
           IF v_exists = 0 then
                   execute immediate 'CREATE TABLE SAG_DATA ( s_aphp_reference_acte_rados varchar2(12), NDA varchar2(10), code_uh_demande varchar2(3), NIP_ACTIF varchar2(10), NIP_PASSIF varchar2(10), FUSION_NOK VARCHAR2(1))';
           end IF;
    	   execute immediate 'select VALIDE FROM DOCUMENT';
     
        end;
       /
     
     
     
     
     
    spool off
    exit
    EOF
    }
     
     
    #########################################################################################################
    #   D E B U T   P R O G R A M M E   P R I N C I P A L
    #########################################################################################################
     
    SCHEMA=$1
    SCHEMAPW=$2
     
    echo " DEBUT"
     
    testSql
     
    echo " FIN"

    Si j'execute cette commande sql depuis sqlplus je n'ai pas d'erreur et la table se crée bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    declare
           v_exists number ;
        begin
    	   SELECT COUNT(*) INTO v_exists FROM user_tables WHERE table_name='SAG_DATA';
           IF v_exists = 0 then
                   execute immediate 'CREATE TABLE SAG_DATA ( s_aphp_reference_acte_rados varchar2(12), NDA varchar2(10), code_uh_demande varchar2(3), NIP_ACTIF varchar2(10), NIP_PASSIF varchar2(10), FUSION_NOK VARCHAR2(1))';
           end IF;
    	   execute immediate 'select VALIDE FROM DOCUMENT';
     
        end;
       /
    Je suis un peu perdu avec ses scripts car ils sont dur a tester.

    Merci

Discussions similaires

  1. Savoir si une table existe dans une base
    Par guznat dans le forum VB.NET
    Réponses: 6
    Dernier message: 26/01/2011, 15h11
  2. Réponses: 3
    Dernier message: 26/02/2007, 10h14
  3. Réponses: 1
    Dernier message: 23/10/2005, 00h55
  4. comment savoir si une table existe dans la base?
    Par isa21493 dans le forum ASP
    Réponses: 6
    Dernier message: 01/09/2005, 17h09
  5. Réponses: 2
    Dernier message: 20/05/2005, 10h18

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