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 :

problème pour écrire un script conditionnel


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 104
    Points : 40
    Points
    40
    Par défaut problème pour écrire un script conditionnel
    Bonjour à tous,

    je voudrais écrire un script que ne sera executé que dans une condition donnée, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
         declare
         begin
             if condition then
               --Création d'une table
             end if;
         end;
    j'ai essayé avec execute immediate : ça marche pour le script de petite taille mais pas le cas par exemple pour la création d'un package de 1000 lignes de code.

    Avez vous une idée?

    Merci d'avance

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    j'ai pas compris... entre IF et END IF tu peux mettre des milliers de ligne de code si tu veux

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 104
    Points : 40
    Points
    40
    Par défaut
    mes scripts je l'écrit de cette façon :
    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
     
         -- le script sans condition qui tourne parfaitement :
          Creation d''une table par exemple
          /
         --le code de creation d'un package
           create or replace package PCK is
             procedure paddition(a integer, b integer);
           end pck;
           /
           create or replace package body PCK is 
             procedure paddition(a integer, b integer) is
                c integer;
             begin
               c:= a +b;
             end;    
           end pck;
           /
     
    -- le script avec condition que ne tourne pas
     
      Creation d''une table par exemple
      /
      declare
      begin
        if condition then
          --le code de creation d'un package
           create or replace package PCK is
             procedure paddition(a integer, b integer)
           end pck;
           /
           create or replace package body PCK is 
             procedure paddition(a integer, b integer) is
                c integer;
             begin
               c:= a +b;
             end;    
           end pck;
           /
        end if;
      end;
       /
    avec cette façon je ne peux pas éxecuter mes scripts.

    Citation Envoyé par orafrance Voir le message
    j'ai pas compris... entre IF et END IF tu peux mettre des milliers de ligne de code si tu veux

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    ha oui... en effet, il n'est pas possible de conditionner la création d'un script... ou alors avec exécute immediate mais j'avoue ne pas comprendre l'intérêt

    conditionner la création de la table OK mais d'un pakage c'est plus qu'étrange

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 104
    Points : 40
    Points
    40
    Par défaut
    L'intêret que j'ai un pakcage que je voudrais l'excuter sous les bases de certains client et pas chez les autres. donc je dois ajouter un test sur le numero de client en cours sachant que j'ai un seul procedure de versionnage pour tous les clients.

    j'ai essayé avec execute immediate: mais il n'accepte pas un paramètre clob en entrée.

    sinon y-a-t-il une possibilité de catcher l'erreur parce si j'execute ce script sur l'un des clients non concernés, un message oracle se declenche vu que ce client n'a pas tous les champs necessaire dans sa base


    Citation Envoyé par orafrance Voir le message
    ha oui... en effet, il n'est pas possible de conditionner la création d'un script... ou alors avec exécute immediate mais j'avoue ne pas comprendre l'intérêt

    conditionner la création de la table OK mais d'un pakage c'est plus qu'étrange

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    et pourquoi pas en batch + SQL*Plus ?

    ou même un drop APRES avoir tout installé ? Parce qu'un execute immediate avec un DROP c'est bcp plus simple qu'avec un CREATE

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 104
    Points : 40
    Points
    40
    Par défaut
    desolé je n'ai pas trop compris

    Citation Envoyé par orafrance Voir le message
    et pourquoi pas en batch + SQL*Plus ?

    ou même un drop APRES avoir tout installé ? Parce qu'un execute immediate avec un DROP c'est bcp plus simple qu'avec un CREATE

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    plutôt que n'installer que le strict nécessaire, tu installes tout et après tu supprimes ce qu'il y a en trop selon le client... enfin, les packages c'est pas ce qui prend le plus de place

  9. #9
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Fichier a.sql:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    prompt creating something
    create table matab (a number);
    Fichier x.sql:
    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
    variable n number
    begin
      select count (1)
        into :n
        from user_tables
        where table_name = 'MATAB';
    end;
    /
    set echo off
    set heading off
    set feedback off
    spool tmp.sql
    select decode (:n, '0', '@a.sql','-- rien') from dual;
    spool off
    @tmp.sql
    SQL*Plus démarré dans le même répertoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL> @x
     
    @a.sql
    creating something
    SQL> @x
     
    -- rien
    DAB

  10. #10
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par FABFAB125 Voir le message
    j'ai essayé avec execute immediate: mais il n'accepte pas un paramètre clob en entrée.
    La solution (sans CLOB):

    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
    declare
      v_cur pls_integer;
      v_sqltab dbms_sql.varchar2a;
      v_dummy number;
    begin
      v_sqltab (1) := 'create or replace procedure proc_enorme is';
      v_sqltab (v_sqltab.count + 1) := 'begin';
      -- 50K .. 1000*50
      for v in 1 .. 1000 loop
        v_sqltab (v_sqltab.count + 1) := ' null; -- 1234567890123456789012345678901234567890';
      end loop;
      v_sqltab (v_sqltab.count + 1) := 'end;';
     
      v_cur := dbms_sql.open_cursor;
      dbms_sql.parse (v_cur, v_sqltab, 1, v_sqltab.count, true, dbms_sql.native);
      v_dummy := dbms_sql.execute (v_cur);
      dbms_sql.close_cursor(v_cur);
    end;
    /
     
    exec proc_enorme
    (testé sur 10g R1)

    DAB

  11. #11
    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
    Citation Envoyé par FABFAB125 Voir le message
    j'ai essayé avec execute immediate: mais il n'accepte pas un paramètre clob en entrée.
    http://download.oracle.com/docs/cd/B...htm#sthref1970
    It must be of type CHAR, VARCHAR2, or CLOB.


    Le CLOB devrait fonctionner, à moins que ta version soit trop ancienne. Merci de préciser ta version

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 104
    Points : 40
    Points
    40
    Par défaut
    la version de la base est 9.2.0.1.0

    Citation Envoyé par laurentschneider Voir le message
    http://download.oracle.com/docs/cd/B...htm#sthref1970
    It must be of type CHAR, VARCHAR2, or CLOB.


    Le CLOB devrait fonctionner, à moins que ta version soit trop ancienne. Merci de préciser ta version

  13. #13
    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
    oui, dans ce cas effectivement ça ne va pas marcher si le code fait plus de 32k. Bon, tu peux toujours migrer vers 11g

  14. #14
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    ...à moins que ta version soit trop ancienne...
    10.2.0.3 n'est pas la version ancienne, j'espère

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Oracle Database 10g Release 10.2.0.3.0 - Production
     
    SQL> declare
      2    x clob;
      3  begin
      4    x := 'begin null; end;';
      5    execute immediate x;
      6  end;
      7  /
     
    ORA-06550: ...
    PLS-00382: ...
    La solution utilisant dbms_sql est disponible à 9.2 pour les ordres plus grand que 32K (avec dbms_sql.varchar2s).

    DAB

  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
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par DAB.cz Voir le message
    10.2.0.3 n'est pas la version ancienne, j'espère
    oui, execute immediate clob est apparu en 11g

Discussions similaires

  1. Problème pour écrire des requetes mysql complexes
    Par truemistress dans le forum Requêtes
    Réponses: 8
    Dernier message: 08/02/2007, 19h29
  2. [Serialisation]Problème pour écrire un DefaultComboBoxModel
    Par Strab dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 22/01/2007, 13h10
  3. Installer un script de Livre d'or en PHP
    Par supdoberman dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 23/11/2006, 16h25
  4. Problème pour exécuter un script Perl
    Par jungle360 dans le forum Langage
    Réponses: 5
    Dernier message: 23/04/2006, 15h37
  5. [Débutant] Problème pour écrire dans un bouton
    Par Paulinho dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 06/01/2006, 12h45

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