Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/03/2011, 17h08   #1
Futur Membre du Club
 
Inscription : juin 2008
Messages : 52
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 52
Points : 18
Points : 18
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 :
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 :
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
karim_sousse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 18h37   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 445
Points : 10 445
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
C'est votre syntaxe du CREATE PROCEDURE qui n'est pas correcte, en effet sur cet objet le DECLARE est implicite :
Code :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/03/2011, 15h11   #3
Futur Membre du Club
 
Inscription : juin 2008
Messages : 52
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 52
Points : 18
Points : 18
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 :
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é..
karim_sousse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 13h45   #4
Membre confirmé
 
Avatar de Ahmed AANGOUR
 
Homme Ahmed AANGOUR
DBA Etudes Oracle
Inscription : janvier 2010
Messages : 123
Détails du profil
Informations personnelles :
Nom : Homme Ahmed AANGOUR
Âge : 33
Localisation : France

Informations professionnelles :
Activité : DBA Etudes Oracle

Informations forums :
Inscription : janvier 2010
Messages : 123
Points : 217
Points : 217
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 :
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
__________________
Mon blog Oracle: http://ahmedaangour.blogspot.com/
Ahmed AANGOUR est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h33.


 
 
 
 
Partenaires

Hébergement Web