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

PL/SQL Oracle Discussion :

Création de vue dans une procédure stockée [12c]


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 169
    Points : 76
    Points
    76
    Par défaut Création de vue dans une procédure stockée
    Bonjour,

    j'ai l'erreur suivante ds ma procedure:
    SQLCODE : -933
    SQLERRM : ORA-00933: la commande SQL ne se termine pas correctement
    voici la procedure:
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    create or replace
    PROCEDURE  PRC_PDD_CRM_CONTRAT_AWS as
        begin
     
     
     
        BEGIN
    --DBMS_OUTPUT.ENABLE;
    DBMS_OUTPUT.PUT_LINE ('Start at'|| TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS'));
    ----------------------------------------------------------------------------------------------------------------------------------
    -- EXTRACTION/CREATION VUE INTERMEDIAIRE POUR REGROUPEMENT ET AGGREGATION DES MONTANTS DES PM quotidiennes  PAR CONTRAT 
    ----------------------------------------------------------------------------------------------------------------------------------
     
      execute immediate 'create or replace view AWM_ADMIN_AIA_DEV_I.CRM_DYNM_CUMUL as
    			select c.id_contrat,cum_vers_1jan ,cum_vers_aprec,cum_vers_uc_1jan,
    			case when cum_vers_1jan <> 0 then ROUND (((a.cum_vers_uc_1jan/a.cum_vers_1jan) * 100 ),2) else null end as tx_uc_collecte_brute ,
    			cum_vers_uc_aprec,
    			cum_rach_1jan RACHAT,
    			cum_rach_aprec RACHAT_APREC,
    			mt_vers_brut_uc mt_prem_verst_uc,
    			mt_vers_brut mt_prem_verst,
          case when cum_vers_1jan = 0 and mt_vers_brut<>0 then  mt_vers_brut else null end as mt_vers_brut_aprec,
          (cum_vers_1jan-mt_vers_brut)  vers_compl ,
    			cd_ptf_rdu  code_portef,
    			TOP_ANN AN,
    			TOP_ANN_APREC   AN_PREC,
    			TOP_MANDAT  contrat_ss_mandat,
    			TOP_OPTFIN
    			from AWM_ADMIN_AIA_DEV_I.PDD_CONTRAT_CALC a
    			inner join AWM_ADMIN_AIA_DEV_I.pdd_contrat_VI b
    			on  a.id_contrat=b.id_contrat 
    			inner join 
    			AWM_ADMIN_AIA_DEV_I.pdd_contrat c on a.id_contrat=c.id_contrat
    			where c.lb_status not in (''sans effet'',''annulé'')
    			group by c.id_contrat,
    			cum_vers_1jan,(cum_vers_1jan-mt_vers_brut),
    			cd_ptf_rdu,
    			TOP_ANN ,
    			TOP_ANN_APREC,
    			TOP_MANDAT ,
    			TOP_OPTFIN,
    			cum_vers_uc_1jan,
    			cum_rach_1jan,
    			cum_rach_aprec,
    			mt_vers_brut_uc,
    			cum_vers_aprec,
    			cum_vers_uc_aprec,
    			mt_vers_brut;';
     
           EXCEPTION
            WHEN NO_DATA_FOUND THEN
            DBMS_OUTPUT.PUT_LINE ('pas de données ds vue CRM_DYNM_CUMUL');
            WHEN OTHERS THEN 
            DBMS_OUTPUT.PUT_LINE('SQLCODE : ' || SQLCODE) ;
           DBMS_OUTPUT.PUT_LINE('SQLERRM : ' || SQLERRM) ;
     
     
     
     
          commit;
     
     
        DBMS_OUTPUT.PUT_LINE ('End at'|| TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS'));
     
     
     
          end;
     
    END PRC_PDD_CRM_CONTRAT_AWS;

    j'ai exécuté la requête seule , et ça fonctionne parfaitement .
    merci

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Pourquoi voulez-vous créer une vue dans une procédure stockée ?

    Pourquoi voulez-vous créer une vue dans une procédure PL/SQL si vous ne maitrisez pas ce langage ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 169
    Points : 76
    Points
    76
    Par défaut
    Bonjour,

    on me l'a imposée. Donc c'est possible ? pas possible ? déconseillé ? ..

    Merci bcp

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 72
    Points : 72
    Points
    72
    Par défaut essaie cela
    Bonjour
    essaie avec une chaine concatenée plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    stmt := 'CREATE OR...' ;
    Stmt := Stmt || ' suite de ta requete' ;
    Stmt := Stmt || ' suite de ta requete' ;
    ...
    Stmt := Stmt || ' cum_vers_uc_aprec,' ;
    Stmt := Stmt ||  ' mt_vers_brut' ;
     
    execute immediate Stmt ;

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par doudou8mc Voir le message
    Bonjour,

    on me l'a imposée. Donc c'est possible ? pas possible ? déconseillé ? ..

    Merci bcp
    C'est possible mais déconseillé. Normalement les entités Oracle sont crées d'une manière pérenne. Le besoin de les créer via une procédure PL/SQL n'arrive pas souvent un simple script SQL suffit pour cela.

    Dans votre procédure vous faites plusieurs erreurs:
    - gestionnaire des exceptions WHEN_OTHERS non suivi d'un raise
    - interception à tort de l'exception NO_DATA_FOUND
    - utilisation d'un commit inutile

    Pour les exceptions la règle est simple: n'intercepter que les exceptions que vous pouvez traiter par la suite. Les autres doivent se propager à l'extérieur de la procédure vers le programme appelant qui n'a qu'a faire de ces exceptions ce que bon lui il semble.

    L'exception NO_DATA_FOUND arrive suite à la construction suivante, propre au langage PL/SQL (il y encore un cas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT <liste_colonnes> Into <liste_variables>|<record> From Table ...
    Le CTAS (create table as select ...) ne corresponde pas à cette structure donc par voie de conséquence l'exception ne sera jamais soulevée.

    Le gestionnaire d'exception WHEN OTHERS intercepte toute autre exception non interceptée avant. Si vous ne le fait suivre par un raise (les cases sont rares et toujours discutables) c'est juste un bug "subtil" que vous programmez dans votre procédure: en fait un problème arrive et vous le cachez sans interrompre la suite des instructions ce qui n'est jamais bon chose.

    "Create" fait partie des commandes DDL et non pas DML et par voie de conséquence ils provoque un commit implicite (deux en fait chez Oracle).

    En fait votre code devrait être structure de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Create Or Replace Procedure P_DDL
      l_sql     varchar2(32767);
    Begin
      l_sql := 'Create Or Replace view ...';
      l_sql := l_sql || 'As Select ...'; -- etc.
     
      $if $$tracing $then
        dbms_output.put_line(l_sql);
      $end;
     
      Execute Immediate l_sql;
    End;
    /

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/02/2012, 11h23
  2. Réponses: 8
    Dernier message: 16/09/2011, 19h35
  3. Réponses: 13
    Dernier message: 27/04/2011, 10h13
  4. Pb de création de vue dans une procédure stockée
    Par Guena5635 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 27/03/2008, 17h45
  5. alternative à la création de vues dans une procedure stockée
    Par cladsam dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/09/2005, 17h07

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