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 :

IF VERSION = ?


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut IF VERSION = ?
    Bonjour,

    J'aimerai executer un SQL sur les vues du dico sur des bases de données 7.3.4, 8.0.5, 8.1.7, 9i et 10g.

    Mon problème est que les vues du dictionnaire peuvent avoir évoluées d'une version d'oracle à l'autre.
    Par exemple un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select to_char(startup_time,'dd/mm/yyyy hh24:mi') "Startup time", status "Status", to_char(sysdate,'dd/mm/yyyy hh24:mi') "sysdate" from v$instance;
    n'est pas possible sur une base 7.

    J'aimerai faire un test en fonction de la version d'oracle du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BEGIN
      if VERSION in ('8','9','10') then
        Select to_char(startup_time,'dd/mm/yyyy hh24:mi') "Startup time", status "Status", to_char(sysdate,'dd/mm/yyyy hh24:mi') "sysdate" from v$instance;
      endif;
    END;
    Je peux récupérer la version dans v$version mais ce n'est pas simple car le champ banner contient plein d'info. Existe-t-il une façon plus simple ?

    Merci par avance pour vos réponses.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est aussi dans v$instance

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut


    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> desc v$instance
     Name                            Null?    Type
     ------------------------------- -------- ----
     KEY                                      VARCHAR2(64)
     VALUE                                    NUMBER
     
    SQL> Select banner from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle7 Workgroup Server Release 7.3.4.2.0 - Production
    PL/SQL Release 2.3.4.4.0 - Production
    CORE Version 3.5.4.0.0 - Production
    TNS for 32-bit Windows: Version 2.3.4.0.0 - Production
    NLSRTL Version 3.2.4.0.1 - Production
    Pas sous la même forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL> select value from v$instance where key='STARTUP TIME - JULIAN';
     
         VALUE
    ----------
       2454340

  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
    Par défaut
    tu es en sqlplus?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    col _startup_time new_v startup_time nopri
    set ver off
    alter session set nls_date_format='dd/mm/yyyy hh24:mi';
     
    select 'startup_time,' "_startup_time"
    from v$version
    where substr(banner, instr(banner,'Release')+8,
      instr(banner,'.')-(instr(banner,'Release')+8)) in ('8','9','10')
    and banner like 'Oracle%';
     
    select &startup_time status,sysdate from v$instance;
    test en 10g

    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> col _startup_time new_v startup_time nopri
    SQL> set ver off
    SQL> alter session set nls_date_format='dd/mm/yyyy hh24:mi';
     
    Session altered.
     
    SQL> select
      2  'startup_time,' "_startup_time"
      3  from v$version
      4  where
      5  substr(banner, instr(banner,'Release')+8,
      6    instr(banner,'.')-(instr(banner,'Release')+8)) in ('8','9','10')
      7  and banner like 'Oracle%';
     
     
     
     
    SQL> 
    SQL> select &startup_time status,sysdate
      2  from v$instance;
     
    STARTUP_TIME     STATUS       SYSDATE
    ---------------- ------------ ----------------
    19/07/2007 13:50 OPEN         28/08/2007 09:48

  5. #5
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Par défaut
    Pourquoi ne pas faire le test sur les 7 premiers caractères de v$version ?
    en v7 -> Oracle7
    en v8 -> Oracle8
    en v9 -> Oracle9
    en v10 -> Oracle10 (là je suis pas sure )
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  6. #6
    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
    Par défaut
    bon, je n'avais pas Oracle7 pour tester. mais j'espère que ça t'a donné une piste

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est pas plus simple de vérifier la présence de la colonne VERSION dans v$instance ?

  8. #8
    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
    Par défaut
    oui, le problème c'est que version n'est apparue qu'en 8.0.5 dans la vue v$instance...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    donc, si version n'existe pas il est en V7

  10. #10
    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
    Par défaut
    pas bête... pour faire encore plus simple :

    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
    BEGIN
      for f in (
        Select to_char(startup_time,'dd/mm/yyyy hh24:mi') Startup, status, 
          to_char(sysdate,'dd/mm/yyyy hh24:mi') d from v$instance
        ) loop
          dbms_output.put_line('Startup time     Status       Sysdate');
          dbms_output.put_line('---------------- ------------ ----------------');
          dbms_output.put_line(f.startup||' '||rpad(f.status,13)||f.d);
      end loop;
    exception  when others then null;
    END;
    /
    Startup time     Status       Sysdate
    ---------------- ------------ ----------------
    19/07/2007 13:50 OPEN         28/08/2007 10:43

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut
    Problème en 7 il ne connait pas les champs :

    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
    SQL> BEGIN
      2    for f in (
      3      Select to_char(startup_time,'dd/mm/yyyy hh24:mi') Startup, status,
      4        to_char(sysdate,'dd/mm/yyyy hh24:mi') d from v$instance
      5      ) loop
      6        dbms_output.put_line('Startup time     Status       Sysdate');
      7        dbms_output.put_line('---------------- ------------ ----------------');
      8        dbms_output.put_line(f.startup||' '||rpad(f.status,13)||f.d);
      9    end loop;
     10  exception  when others then null;
     11  END;
     12  /
        Select to_char(startup_time,'dd/mm/yyyy hh24:mi') Startup, status,
                       *
    ERREUR Ó la ligne 3 :
    ORA-06550: line 3, column 20:
    PLS-00201: identifier 'STARTUP_TIME' must be declared
    ORA-06550: line 3, column 5:
    PL/SQL: SQL Statement ignored
    ORA-06550: line 8, column 28:
    PLS-00364: loop index variable 'F' use is invalid
    ORA-06550: line 8, column 7:
    PL/SQL: Statement ignored

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Laurent a oublié que le parsing se fout royalement de l'exception

    DBA_TAB_COLUMNS existe en 7 ?

  13. #13
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut
    Oui

    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
    SQL> desc DBA_TAB_COLUMNS ;
     Name                            Null?    Type
     ------------------------------- -------- ----
     OWNER                           NOT NULL VARCHAR2(30)
     TABLE_NAME                      NOT NULL VARCHAR2(30)
     COLUMN_NAME                     NOT NULL VARCHAR2(30)
     DATA_TYPE                                VARCHAR2(9)
     DATA_LENGTH                     NOT NULL NUMBER
     DATA_PRECISION                           NUMBER
     DATA_SCALE                               NUMBER
     NULLABLE                                 VARCHAR2(1)
     COLUMN_ID                       NOT NULL NUMBER
     DEFAULT_LENGTH                           NUMBER
     DATA_DEFAULT                             LONG
     NUM_DISTINCT                             NUMBER
     LOW_VALUE                                RAW(32)
     HIGH_VALUE                               RAW(32)
     DENSITY                                  NUMBER
     NUM_NULLS                                NUMBER
     NUM_BUCKETS                              NUMBER
     LAST_ANALYZED                            DATE
     SAMPLE_SIZE                              NUMBER

    On peut faire du SQL dynamique en 7 ?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    pas besoin de SQL dynamique.

    Par contre, v$instance n'est pas une table donc dba_tab_columns c'est pas bon

  15. #15
    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
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Laurent a oublié que le parsing se fout royalement de l'exception
    bien sûr!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    set serverout on
    DECLARE
      startup varchar2(16);  d varchar2(16);  status varchar2(12);
    BEGIN
      execute immediate 'Select to_char(startup_time,''dd/mm/yyyy hh24:mi''), status, to_char(sysdate,''dd/mm/yyyy hh24:mi'') from v$instance'
        into startup,status,d;
      dbms_output.put_line('Startup time     Status       Sysdate');
      dbms_output.put_line('---------------- ------------ ----------------');
      dbms_output.put_line(startup||' '||rpad(status,13)||d);
    exception
      when others then null;
    END;
    /
    PS: dba_tab_columns contient aussi les vues
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select count(*) from dba_tab_columns where table_name='V_$INSTANCE'
    16

  16. #16
    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
    Par défaut
    je n'ai pas de Oracle 7, je ne sais pas si EXECUTE IMMEDIATE va fonctionner. Sinon il faut employer DBMS_SQL

  17. #17
    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
    Par défaut
    mais au lieu de perdre du temps à maintenir des scripts pour Oracle7, tu pourrais simplement faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PROMPT Oracle7 is not supported
    select status from v$instance;

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est une idée en effet

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    PS: dba_tab_columns contient aussi les vues
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select count(*) from dba_tab_columns where table_name='V_$INSTANCE'
    16

    En effet, alors :

    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
    CREATE OR REPLACE FUNCTION IsVersion7 
    dummy NUMBER;
    BEGIN
      SELECT 1
         INTO dummy
        FROM dba_tab_columns 
      WHERE table_name='V_$INSTANCE'
          AND column_name = 'VERSION';
     
      RETURN FALSE;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN 
      RETURN TRUE;
    END;
    /
    Sous SQL*Plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SPOOL exec_verif_instance.sql
    BEGIN
      IF NOT IsVersion7 THEN
        dbms_output.put_line('Select to_char(startup_time,''dd/mm/yyyy hh24:mi''), status, to_char(sysdate,''dd/mm/yyyy hh24:mi'') from v$instance');
      ELSE
        dbms_output.put_line('PROMPT Version 7 not supported');
      ENDIF;  
    END;
    /
    Et on execute exec_verif_instance.sql... c'est à peine lourd

  20. #20
    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
    Par défaut
    dans le genre lourd je verrais bien :

    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
     
    col INSTANCE_NUMBER nopri               
    col INSTANCE_NAME nopri                 
    col HOST_NAME nopri                     
    col VERSION nopri                       
    col STARTUP_TIME pri                  
    col STATUS pri                        
    col PARALLEL nopri                      
    col THREAD# nopri                       
    col ARCHIVER nopri                      
    col LOG_SWITCH_WAIT nopri               
    col LOGINS nopri                        
    col SHUTDOWN_PENDING nopri              
    col DATABASE_STATUS nopri               
    col INSTANCE_ROLE nopri                 
    col ACTIVE_STATE nopri                  
    col BLOCKED nopri
    alter session set nls_date_format='DD/MM/YYYY HH24:MI';
    select i.*, sysdate 
    from v$instance i, v$version 
    where banner like 'Oracle%' and banner not like 'Oracle7%' ;

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

Discussions similaires

  1. [Kylix] [Kylix 3] Installation version Open
    Par muadib dans le forum EDI
    Réponses: 1
    Dernier message: 14/03/2003, 16h37
  2. [SYBASE] Versions de Sybase
    Par ora9i dans le forum Sybase
    Réponses: 5
    Dernier message: 25/10/2002, 12h22
  3. [Kylix] cours & version utilisable de Kylix
    Par Suricate dans le forum EDI
    Réponses: 1
    Dernier message: 19/09/2002, 18h22
  4. Version étudiant de Delphi 6
    Par Smortex dans le forum EDI
    Réponses: 2
    Dernier message: 20/07/2002, 11h13

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