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 :

comment eviter ora-00942 lors d'un drop table


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 18
    Points : 8
    Points
    8
    Par défaut comment eviter ora-00942 lors d'un drop table
    Bonjour,
    Quelqu'un a t'il une astuce pour éviter l'erreur 942 lors d'un drop table si celle ci n'existe pas (c'est a dire avoir l'équivalent du if existe en sql serveur)
    Si vous avec une procedure ou un exemple, merci de me les donner

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    pour savoir si la table existe ou non, regardez dans la vue user_tables.
    Puis vous pourrez faire votre drop table si elle existe bien evidement

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    faire un select pour voir si la table existe dans la user_table ok, c'est simple mais faire un drop .. if .... , cela se corse
    auriez vous un exemple de script ou procédure ?
    merci d'avance

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Voila une routine rudimentaire qu'il convient d'améliorer ( notament en l'intégrant à une procédure ) :

    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
     
    SQL> create table dvp ( a number ) ; 
     
    Table créée.
     
    SQL> set serveroutput on ; 
    SQL> declare 
      2  temp number ; 
      3  tab_supp varchar2(30) := 'DVP';
      4  begin 
      5  select count (table_name) into temp from user_tables where table_name =tab_supp;
      6  if temp = 0
      7  then 
      8   dbms_output.put_line ('table non presente') ; 
      9  else 
     10   execute immediate 'drop table '||tab_supp;
     11   dbms_output.put_line ('table suivante a été supprimer'|| tab_supp) ; 
     12  end if ; 
     13  dbms_output.put_line (temp) ; 
     14  end ; 
     15   
     16  /
    table suivante a été supprimerDVP
    1
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> set serveroutput on ; 
    SQL> declare 
      2  temp number ; 
      3  tab_supp varchar2(30) := 'DVP';
      4  begin 
      5  select count (table_name) into temp from user_tables where table_name =tab_supp;
      6  if temp = 0
      7  then 
      8   dbms_output.put_line ('table non presente') ; 
      9  else 
     10   execute immediate 'drop table '||tab_supp;
     11   dbms_output.put_line ('table suivante a été supprimer'|| tab_supp) ; 
     12  end if ; 
     13  dbms_output.put_line (temp) ; 
     14  end ; 
     15   
     16  /
    table non presente
    0
     
    Procédure PL/SQL terminée avec succès.
     
    SQL>
    Bon courage

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    tu crée une fonction exoist par exemple

    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
     
    Function EXIST( req in varchar2)
    return boolean
    is
    myREQUEST varchar2(1000);
    myRESULT boolean;
    begin
           myREQUEST := 'select 1 from dual where exists ('||req||') and rownum=1';
     
           execute immediate myREQUEST into myRESULT ;
     
           return myRESULT;
     
           exception when no_data_found then
               return false;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    puis tu envoie quelque chose du genre
     
    if not exist(select table_name from user_table where....)
    then..
    else drop table ...
    end if

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Aline,
    voilà ce que j'ai fait (excuse je dois pas etre doué ...)
    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
    CREATE OR REPLACE FUNCTION AKFSI.EXIST
    (req in varchar2)
        RETURN   boolean 
        is 
        myREQUEST varchar2(1000);
        myRESULT boolean;
            BEGIN
            myREQUEST :='select 1 from dual where exists ('||req||') and rownum=1';
            execute immediate myREQUEST into myRESULT ;
            return myRESULT;
            exception when no_data_found then
            return false;
     
            END;
    /
     
    voila ce que je teste en sqlplus
    begin
    if exists(select table_name from sys.dba_tables where table_name = 'ESSAIPV') 
    then 
    drop table ESSAIPV;  
    end if;
    end;
    /
     
    et il me renvoie les erreurs suivantes :
     
    drop table ESSAIPV;
    *
    ERROR at line 4:
    ORA-06550: line 4, column 1:
    PLS-00103: Encountered the symbol "DROP" when expecting one of the following:
    begin case declare exit for goto if loop mod null pragma
    raise return select update while with <an identifier>
    <a double-quoted delimited-identifier> <a bind variable> <<
    close current delete fetch lock insert open rollback
    savepoint set sql execute commit forall merge
    <a single-quoted SQL string> pipe

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    essaye

    execute immediate 'drop table ESSAIPV'

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Bonjour
    voici le resultat ce matin , vois tu ou se trouve l'erreur
    MERCI D'AVANCE
    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
    Connected to:
    Oracle9i Release 9.2.0.5.0 - Production
    JServer Release 9.2.0.5.0 - Production
     
    SQL> begin
      2  if exxist(select table_name from sys.dba_tables where table_name = 'ESSAIPV')
      3  then 
      4  execute immediate 'drop table akfsi.ESSAIPV' 
      5  end if;
      6  end ;
      7  /
    if exxist(select table_name from sys.dba_tables where table_name = 'ESSAIPV')
              *
    ERROR at line 2:
    ORA-06550: line 2, column 11:
    PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:
    ( ) - + case mod new not null others <an identifier>
    <a double-quoted delimited-identifier> <a bind variable>
    table avg count current exists max min prior sql stddev sum
    variance execute multiset the both leading trailing forall
    merge year month DAY_ hour minute second timezone_hour
    timezone_minute timezone_region timezone_abbr time timestamp
    interval date
    <a string literal with character set specificat
    ORA-06550: line 2, column 77:
    PLS-00103: Encountered the symbol ")" when expecting one of the following:
    . ( * @ % & - + ; / at for mod rem <an exponent (**)> and or
    group having intersect minus order start union where connect
    ||
     
     
    SQL>

  9. #9
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    C'est la foire aux erreurs ce post !!!

    Essaie plutôt :
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE FUNCTION AKFSI.EXIST 
    (req in varchar2) 
    RETURN   boolean IS 
        myREQUEST varchar2(1000); 
        myRESULT number; 
    BEGIN 
        myREQUEST :='select 1 from dual where exists ('||req||') and rownum=1'; 
        execute immediate myREQUEST into myRESULT ; 
        return (myRESULT=1); 
    exception when no_data_found then 
        return false; 
    END; 
    /

    Pour la lancer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    begin 
    if exist('select table_name from sys.dba_tables where table_name = ''ESSAIPV''') 
    then 
      execute immediate 'drop table ESSAIPV';
    end if; 
    end;
    Notes que tu aurais pu tout faire en une seule procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create or replace procedure drop_table (p_table in varchar2) is
      not_dropable exception;
      pragma exception_init (not_dropable, -942);
    begin
    execute immediate 'drop table ' || p_table;
    exception
       when not_dropable then
               dbms_output.put_line ('Inexistante');
    end;
    /
    Et l'appel sous SQL*Plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec drop_table ('toto')

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    désolé mais la création de la fonction ne passe plus avec result=1
    pls-00306 wrong number or types of arguments in call to '='
    sinon l'idée avec pragma est bonne ...

    mais maintenant que je suis partie avec cette solution, j'aimerai bien que cela ce solde par un succès
    histoire d'être moins bète ce soir ...

  11. #11
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Bonjour sqlakf76
    Merci d'utiliser le forum Oracle de DVP ,
    Merci d'utiliser les balises QUOTE et CODE qui améliorent la lisibilité du code.

    Jaouad

  12. #12
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    J'avais laissé la déclaration de myResult en boolean.

    J'ai corrigé mon précédent message, la création de la fonction EXIST est bonne.

  13. #13
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    En effet on avance le procédure s'est bien compilée
    mais au lancement

    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
    SQL> begin 
      2  if exists('select table_name from sys.dba_tables where table_name = ''ESSAIPV''') 
      3  then 
      4    execute immediate 'drop table ESSAIPV'; 
      5  end if; 
      6  end;
      7  /
     
    erreur renvoyée
     
    ERROR at line 2:
    ORA-06550: line 2, column 11:
    PLS-00103: Encountered the symbol "select table_name from sys.dba_tables where
    table_name = 'ESSAIP" when expecting one of the following:
    ( select

  14. #14
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    Citation Envoyé par plaineR
    J'avais laissé la déclaration de myResult en boolean.

    J'ai corrigé mon précédent message, la création de la fonction EXIST est bonne.
    Petite question pour tout embrouiller.
    C'est quoi la différence entre ta fonction exist et celle que j'avais posté?
    Je viens de tester et elle marche très bien.

  15. #15
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par aline
    Petite question pour tout embrouiller.
    C'est quoi la différence entre ta fonction exist et celle que j'avais posté?
    Je viens de tester et elle marche très bien.
    Ben chez moi il n'aimait pas que je renvoie 1 dans la variable MyResult qui est de type boolean.

  16. #16
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par sqlakf76
    SQL> begin
    2 if exists('select table_name from sys.dba_tables where table_name = ''ESSAIPV''')
    3 then
    4 execute immediate 'drop table ESSAIPV';
    5 end if;
    6 end;
    7 /

    erreur renvoyée

    ERROR at line 2:
    ORA-06550: line 2, column 11:
    PLS-00103: Encountered the symbol "select table_name from sys.dba_tables where
    table_name = 'ESSAIP" when expecting one of the following:
    ( select
    Ta fonction s'appelle exist et non exists

  17. #17
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    Citation Envoyé par plaineR
    Citation Envoyé par aline
    Petite question pour tout embrouiller.
    C'est quoi la différence entre ta fonction exist et celle que j'avais posté?
    Je viens de tester et elle marche très bien.
    Ben chez moi il n'aimait pas que je renvoie 1 dans la variable MyResult qui est de type boolean.
    bizarre, c'est à creuser alors.
    J'utilise toujours ca moi!

  18. #18
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 18
    Points : 8
    Points
    8
    Par défaut

    hello tous

    personne ne vois ou se trouve mon erreur :

  19. #19
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    regarde la dernière réponse de plainer!

  20. #20
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    en effet, j'ai corrigé mon erreur au niveau du nom de fonction
    merci

    mais je crois que je vais tout de même craqué
    car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL> begin 
      2  if exist('select table_name from sys.dba_tables where table_name = ''ESSAIPV''') 
      3  then 
      4    execute immediate 'drop table ESSAIPV'; 
      5  end if; 
      6  end;
      7  
      8  /
    begin
    *
    ERROR at line 1:
    ORA-00942: table or view does not exist
    ORA-06512: at "AKFSI.EXIST", line 8
    ORA-06512: at line 2

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. ORA-00054 lors d'un DROP d'index
    Par Wurlitzer dans le forum SQL
    Réponses: 8
    Dernier message: 04/12/2012, 15h20
  2. ora-00942 lors d'un truncate sur une table qui existe
    Par olivier] dans le forum Oracle
    Réponses: 2
    Dernier message: 17/11/2011, 17h08
  3. Comment Eviter un popup lors d'un Spreadsheet
    Par spika_18 dans le forum SharePoint
    Réponses: 0
    Dernier message: 23/03/2011, 17h21
  4. Comment Eviter ORA-01403(aucune donnée trouvée)
    Par riadhhwajdii dans le forum PL/SQL
    Réponses: 7
    Dernier message: 28/01/2011, 12h06
  5. Réponses: 1
    Dernier message: 03/03/2008, 09h56

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