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 :

Bloc PL/SQL et INSERT SELECT


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Par défaut Bloc PL/SQL et INSERT SELECT
    Bonjour,

    Je suis en train de construire une procédure PL/SQL mais je rencontre quelques difficultés. Je vous explique :

    Le but de ma procédure est de construire une requête SELECT avec des INTERSECT, puis d'utiliser le résultat de cette requête afin de l'insérer dans une Vue ou un tableau pour une future utilisation..

    voici le code de la construction de la requête SELECT qui est fonctionnel :
    en ajoutant le code de l'insertion a la fin de la procedure, le bloc devient erroné

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    create or replace PROCEDURE P_RequetesDansCible(
          nSysteme_id         IN SYST_PHASE.SYSTEME_ID%TYPE,
          sPhases_id          IN SYST_PHASE.PHASE_ID%TYPE,
          nModeleSystemeID    IN PROJ_SYSTEMES.DEF_SYSTEME_ID%TYPE,
          nTypeSystemeID      IN NS_NATURE_APPLICABLE.TYPE_ID%TYPE,
          nProjet_id          IN REQUETES.PROJET_ID%TYPE,
          dtDateDebut         IN REQUETES.DATE_SOUMISSION%TYPE,
          dtDateFin           IN REQUETES.DATE_SOUMISSION%TYPE,
          nWfClientID         IN NS_REQ_DELAI.WF_CLIENT_ID%TYPE,
          nReturnCode	      IN OUT NUMBER
    	) AS
    BEGIN
     
    DECLARE
     
        NumLigne       INTEGER;
     
        strQuery       VARCHAR2(2000) := ' ';
        CURSOR Creq
        IS
        SELECT DISTINCT(delai_id) FROM ns_matrice_delai WHERE phase_id= sPhases_id;
     
    BEGIN
    	strSelect   := ' ';
        NumLigne    := 1;
     
        FOR Crec IN Creq LOOP
     
         strQuery := ' ( SELECT R.REQUETE_ID, R.SOMMAIRE, RN.DESCRIPTION, RSV.DESCRIPTION, R.DEMANDEE_PAR, RST.DESCRIPTION,
                R.AFFECTEE_A_RES, VSS.DESCRIPTION, C.NOM_CLIENT
            FROM
                 REQUETES R, REQ_NATURES RN, REQ_SEVERITES RSV, REQ_STATUT RST,
                  PROJ_SYSTEMES P, SYST_PHASE SP, v_sous_systemes VSS, CLIENTS C , NS_REQ_DELAI NRD
            WHERE
                  R.NATURE_ID = RN.NATURE_ID
                  AND RSV.SEVERITE_ID = R.SEVERITE_ID
                  AND R.SYSTEME_ID = P.SYSTEME_ID
                  AND SP.SYSTEME_ID = P.SYSTEME_ID
                  AND RN.TYPE_ID = P.TYPE_ID
                  AND R.STATUT_ID = RST.STATUT_ID
                  AND R.SYSTEME_ID = nSysteme_id
                  AND R.PHASES_ID = sPhases_id
                  AND R.SYSTEME_ID =  P.SYSTEME_ID
                  AND SP.SYSTEME_ID =  P.SYSTEME_ID
                  AND R.PHASES_ID = SP.PHASE_ID
                  AND P.DEF_SYSTEME_ID = nModeleSystemeID
                  AND R.SS_SYSTEME_ID = VSS.ss_systeme_id
                  AND P.DEF_SYSTEME_ID = VSS.SYSTEME_ID
                  AND R.CLIENT_ID = C.CLIENT_ID
                  AND R.NATURE_ID IN (SELECT NATURE_ID FROM ns_nature_applicable WHERE type_id = nTypeSystemeID
                  AND SYSTEME_ID = nSysteme_id
                  AND PHASE_ID = sPhases_id
                  AND NVL(sla_applicable, 0)=1 )
                  AND R.PROJET_ID = nProjet_id
                  AND R.SYSTEME_ID =    nSysteme_id
                  AND R.PHASES_ID = sPhases_id
                  AND TRUNC(R.DATE_SOUMISSION) >= dtDateDebut
                  AND TRUNC(R.DATE_SOUMISSION) <= dtDateFin
                  AND NRD.PHASES_ID = sPhases_id
                  AND NRD.wf_client_id = nWfClientID
                  AND NRD.SEVERITE_ID = R.SEVERITE_ID
                  AND NRD.REQUETE_ID = R.REQUETE_ID
     
                  AND NRD.DELAI_ID = Crec.delai_id AND NRD.DELAIREEL <= (SELECT TO_NUMBER(VALEUR)
                                                   FROM ns_matrice_delai
                                                   WHERE
                                                   DELAI_ID = NRD.DELAI_ID
    			                                         AND DELAI_ID = Crec.delai_id
                                                   AND wf_client_id = NRD.wf_client_id
                                                   AND SYSTEME_ID = R.SYSTEME_ID
                                                   AND PHASE_ID = R.PHASES_ID
                                                   AND SEVERITE_ID = R.SEVERITE_ID
                                                   )
              )  ';
     
              NumLigne := NumLigne +1;
              strSelect := strSelect|| strQuery;
     
              IF NumLigne <> Creq%ROWCOUNT  THEN
               strSelect := strSelect || 'INTERSECT';
              END IF;
          END LOOP;
     
     
    -- ici le code de l'insertion des valeurs avec "strSelect" dans la table qui est déja préparée
     
    	insert into synthese_sla_temp (strSelect);
     
     
    END;
    END P_RequetesDansCible;
    l'erreur générée par la dernière clause de l'insertion est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    91/43    PLS-00103: Encountered the symbol ";" when expecting one of the
             following:
             ( select values
    Je vous remercie pour votre aide

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    C'est votre syntaxe du CREATE PROCEDURE qui n'est pas correcte, en effet sur cet objet le DECLARE est implicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE PROCEDURE ...
    IS
      ... -- ici pour déclarer vos variables supplémentaires
    BEGIN
        ....
    END;
    De plus, regardez ici comment passer des paramètres à un SQL dynamique, car là ce que vous avez écrit ne va pas fonctionner :
    http://sheikyerbouti.developpez.com/...mmediate/#L4.3

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Par défaut
    Je vous remercie Waldar pour votre réponse. En fait la déclaration de la procédure est correcte mais le truc qui cloche c'est bien l'instruction INSERT qui doit utiliser la variable chaine strSelect..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    -- ici le code de l'insertion des valeurs avec "strSelect" dans la table qui est déja préparée
     
    	INSERT INTO synthese_sla_temp (strSelect);
    J'ai pas compris comment je pourrais y utiliser le SQL dynamique, j'avoue que je suis un peu bloqué..

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

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Janvier 2010
    Messages : 139
    Par défaut
    Bonjour,

    Je ne vois pas à quoi sert votre bloc BEGIN+DECLARE+END au début de votre proc.
    Vous pouvez vous en passer car ce qui se trouve entre le CREATE PROCEDURE et le BEGIN équivaut à la zone DECLARE d'un bloc PL/SQL anonyme:
    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
     
    SQL> create or replace procedure toto is
      2  BEGIN
      3  DECLARE
      4
      5    NumLigne       INTEGER;
      6    BEGIN
      7      NumLigne    := 1;
      8
      9    END;
     10  end toto;
     11  /
     
    Procedure created.
     
    SQL> drop procedure toto;
     
    Procedure dropped.
     
    SQL> create or replace procedure toto is
      2    NumLigne       INTEGER;
      3  begin
      4    NumLigne    := 1;
      5  end toto;
      6  /
     
    Procedure created.
    Concernant votre problème, si vous voulez construire une requête dynamiquement il faut utiliser la clause EXECUTE IMMEDIATE:
    http://download.oracle.com/docs/cd/B..._statement.htm

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/10/2011, 17h36
  2. insert into sql server 2005 select from XLSX
    Par enstein8 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/10/2011, 12h52
  3. SQL question d'insert + SELECT (ASP.NET 1.1 c# + SQL)
    Par Seth_75 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 25/08/2008, 14h19
  4. [My SQL]probleme avec insert select
    Par jmjmjm dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/01/2007, 11h24
  5. SQL : syntaxe insert into select
    Par chrislauxerrois dans le forum Access
    Réponses: 15
    Dernier message: 31/07/2006, 16h12

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