Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
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 04/09/2007, 09h55   #1
Membre actif
 
Inscription : novembre 2004
Messages : 311
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 311
Points : 157
Points : 157
Par défaut Problème proc. stockée sous Oracle 8

Bonjour,

J'ai le INSERT - SELECT suivant dans une proc. stockée :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
INSERT 
  INTO ENVELOPPE
SELECT DISTINCT CODE_MARCHE_NATIONAL, 
                MAPU.NUMERO_PERIODE, 
                DATE_DEBUT_PERIODE, 
		DATE_FIN_PERIODE, 
		MAPU.NUMERO_LOT, 
		MAPU.code_uag , 
                MAPU.MT_MAX_UAG, 
                MAPU.MT_MAX_UAG - (SELECT NVL(SUM(MONTANT_HT_EJ),0) TOTAL
                                   FROM EJ
                                   WHERE EJ.NUMERO_PERIODE =  MAPU.NUMERO_PERIODE
                                     AND EJ.NUMERO_LOT = MAPU.NUMERO_LOT 
                                     AND EJ.MARCHE = V_MARCHE.CODE_MARCHE_NATIONAL
                                     AND EJ.CODE_UAG = MAPU.code_uag)
FROM MONTANT_AUTORISE_PAR_UAG MAPU,
    (SELECT DISTINCT id_marche,CODE_MARCHE_NATIONAL FROM marche
      WHERE CODE_STATUT = 'N'
        AND CODE_PRM <> '02') V_MARCHE,  PERIODE     
WHERE MAPU.id_marche = V_MARCHE.id_marche
  AND MAPU.ID_PERIODE = PERIODE.ID_PERIODE;
Cet INSERT fonctionne sous SQL*Plus mais me renvoie l'erreur suivante lorsque je compile la proc. stockée :

Citation:
Erreurs pour PROCEDURE P_TEST1 :

LINE/COL ERROR
-------- ----------------------------------------------------------------
19/36 PLS-00103: Symbole "SELECT" rencontrÚ Ó la place d'un des
symboles suivants :
( - + mod not null others <an identifier>
<a double-quoted delimited-identifier> <a bind variable> avg
count current exists max min prior sql stddev sum variance
execute forall time timestamp interval date
<a string literal with character set specification>
<a number> <a single-quoted SQL string>

25/1 PLS-00103: Symbole "FROM" rencontrÚ Ó la place d'un des symboles
suivants :

LINE/COL ERROR
-------- ----------------------------------------------------------------
; return returning and or
Auriez-vous une idée ?

Merci.
davy.g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 10h10   #2
Membre du Club
 
Avatar de Bahan
 
Inscription : avril 2006
Messages : 147
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : avril 2006
Messages : 147
Points : 54
Points : 54
Envoyer un message via MSN à Bahan
La ligne 19 c'est laquelle ? ^_^
Si tu pouvais nous mettre la procédure en entier.

Merci.

Bahan
Bahan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 10h13   #3
Membre actif
 
Inscription : novembre 2004
Messages : 311
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 311
Points : 157
Points : 157
Voici la proc. stockée en entier :

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
 
CREATE OR REPLACE PROCEDURE p_test1( pVar_codret IN out number, pOra_error IN out varchar2 ) IS
 
BEGIN
 
INSERT 
  INTO ENVELOPPE
SELECT DISTINCT CODE_MARCHE_NATIONAL, 
                MAPU.NUMERO_PERIODE, 
                DATE_DEBUT_PERIODE, 
		DATE_FIN_PERIODE, 
		MAPU.NUMERO_LOT, 
		MAPU.code_uag , 
                MAPU.MT_MAX_UAG, 
                MAPU.MT_MAX_UAG - (SELECT NVL(SUM(MONTANT_HT_EJ),0) TOTAL
                                   FROM EJ
                                   WHERE EJ.NUMERO_PERIODE =  MAPU.NUMERO_PERIODE
                                     AND EJ.NUMERO_LOT = MAPU.NUMERO_LOT 
                                     AND EJ.MARCHE = V_MARCHE.CODE_MARCHE_NATIONAL
                                     AND EJ.CODE_UAG = MAPU.code_uag)
FROM MONTANT_AUTORISE_PAR_UAG MAPU,
    (SELECT DISTINCT id_marche,CODE_MARCHE_NATIONAL FROM marche
      WHERE CODE_STATUT = 'N'
        AND CODE_PRM <> '02') V_MARCHE,  PERIODE     
WHERE MAPU.id_marche = V_MARCHE.id_marche
  AND MAPU.ID_PERIODE = PERIODE.ID_PERIODE;
 
 
END p_test1;
/
La ligne 19 correspond au SELECT après le ' - ' ( moins : signe négatif ).
davy.g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 10h38   #4
Membre du Club
 
Avatar de Bahan
 
Inscription : avril 2006
Messages : 147
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : avril 2006
Messages : 147
Points : 54
Points : 54
Envoyer un message via MSN à Bahan
Nous pourrions peut-être essayer ça.

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
CREATE OR REPLACE PROCEDURE p_test1
  (  pVar_codret IN OUT NUMBER
  ,  pOra_error IN OUT VARCHAR2)
IS
  vRequete VARCHAR2(4000);
  vNomFonction VARCHAR2(50);
  vErrReq EXCEPTION;
BEGIN
  vNomFonction := 'p_test1';
 
  vRequete := '
    INSERT INTO ENVELOPPE
    SELECT DISTINCT
      CODE_MARCHE_NATIONAL, 
      MAPU.NUMERO_PERIODE, 
      DATE_DEBUT_PERIODE, 
      DATE_FIN_PERIODE, 
      MAPU.NUMERO_LOT, 
      MAPU.code_uag, 
      MAPU.MT_MAX_UAG, 
      MAPU.MT_MAX_UAG - (
            SELECT NVL(SUM(MONTANT_HT_EJ),0) TOTAL
            FROM EJ
            WHERE EJ.NUMERO_PERIODE =  MAPU.NUMERO_PERIODE
            AND EJ.NUMERO_LOT = MAPU.NUMERO_LOT 
            AND EJ.MARCHE = V_MARCHE.CODE_MARCHE_NATIONAL
            AND EJ.CODE_UAG = MAPU.code_uag)
    FROM
      MONTANT_AUTORISE_PAR_UAG MAPU,
      (
        SELECT DISTINCT 
          id_marche,
          CODE_MARCHE_NATIONAL 
        FROM marche
        WHERE CODE_STATUT = ''N''
        AND CODE_PRM <> ''02''
      ) V_MARCHE,
      PERIODE
    WHERE MAPU.id_marche = V_MARCHE.id_marche
    AND MAPU.ID_PERIODE = PERIODE.ID_PERIODE
  ';
 
  EXECUTE IMMEDIATE vRequete;
EXCEPTION
  WHEN vErrReq THEN
    DBMS_OUTPUT.put_line(vNomFonction||'\ERREUR dans la requête : '||vRequete);
  WHEN OTHERS THEN
    DBMS_OUTPUT.put_line(vNomFonction||'\ERREUR Oracle '||TO_NUMBER(SQLCODE)||' : '||SQLERRM);
END p_test1;
Je vois que tu mets un code retour dans tes paramètres, ne voudrais-tu pas dans ce cas utiliser une fonction plutôt qu'une procédure stockée ?

Cdt.

Bahan
Bahan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 10h56   #5
Membre actif
 
Inscription : novembre 2004
Messages : 311
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 311
Points : 157
Points : 157
Le code retour est pour les messages d'erreurs. Je n'ai pas mis toute la proc.

Le problème vient de ce INSERT SELECT.

Ce que je ne comprends pas, c'est pourquoi il passe sous SQL*Plus et pas dans une proc. stockée. ???
davy.g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 11h01   #6
Membre du Club
 
Avatar de Bahan
 
Inscription : avril 2006
Messages : 147
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : avril 2006
Messages : 147
Points : 54
Points : 54
Envoyer un message via MSN à Bahan
Là, cela ne passe toujours pas ?

Vous avez essayé de la compiler (ça doit marcher ça ^_^) et de la lancer ?
Pourriez-vous m'afficher le buffer de sortie ?

Une autre question : quel front end utilisez-vous ? PL/SQL developper ? Toad ?

Bahan
Bahan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 11h28   #7
Membre actif
 
Inscription : novembre 2004
Messages : 311
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 311
Points : 157
Points : 157
Je n'ai pas testé le EXECUTE IMMEDIATE mais j'imagine bien que cela va passer.
Je souhaite plus essayer de comprendre pourquoi dans une procédure cet ordre INSERT - SELECT ne fonctionne pas !
davy.g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 12h05   #8
Membre du Club
 
Avatar de Bahan
 
Inscription : avril 2006
Messages : 147
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : avril 2006
Messages : 147
Points : 54
Points : 54
Envoyer un message via MSN à Bahan
Je pense que c'est tout simplement un problème de syntaxe.

A moins d'utiliser un curseur (CURSOR ou FOR etc...) ou si le résultat ne renvoie qu'une seule ligne (SELECT gnagna INTO variable), on ne peut pas faire de SELECT comme ça dans du code PLSQL.

Enfin, le must reste sinon la documentation Oracle (je pense) : PL/SQL User's Guide and Reference

En tout cas, bon courage et bon appétit .

Cdt.

Bahan
Bahan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 14h48   #9
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
J'ai extrapolé ton modèle de donnée et :

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
 
CREATE TABLE mapu
(numero_periode NUMBER,
date_debut_periode DATE,
date_fin_periode DATE,
numero_lot NUMBER,
code_uag NUMBER,
mt_max_uag NUMBER,
id_marche NUMBER,
id_periode NUMBER);
> TABLE créée
 
CREATE TABLE EJ
(montant_ht_ej NUMBER,
numero_periode NUMBER,
numero_lot NUMBER,
marche NUMBER,
code_uag NUMBER);
> TABLE créée 
 
CREATE TABLE marche
(id_marche NUMBER,
code_marche_national NUMBER,
code_statut VARCHAR2(1),
code_prm VARCHAR2(2));
> TABLE créée
 
CREATE TABLE enveloppe
(code_marche_national NUMBER,
numero_periode NUMBER,
date_debut_periode DATE,
date_fin_periode DATE,
numero_lot NUMBER,
code_uag NUMBER,
mt_max_uag NUMBER,
diff_mt NUMBER);
> TABLE créée 
 
CREATE OR REPLACE PROCEDURE p_test1( pVar_codret IN out number, pOra_error IN out varchar2 ) IS
 
BEGIN
 INSERT 
  INTO ENVELOPPE
SELECT DISTINCT CODE_MARCHE_NATIONAL, 
                MAPU.NUMERO_PERIODE, 
                DATE_DEBUT_PERIODE, 
        DATE_FIN_PERIODE, 
        MAPU.NUMERO_LOT, 
        MAPU.code_uag , 
                MAPU.MT_MAX_UAG, 
                MAPU.MT_MAX_UAG - (SELECT NVL(SUM(MONTANT_HT_EJ),0) TOTAL
                                   FROM EJ
                                   WHERE EJ.NUMERO_PERIODE =  MAPU.NUMERO_PERIODE
                                     AND EJ.NUMERO_LOT = MAPU.NUMERO_LOT 
                                     AND EJ.MARCHE = V_MARCHE.CODE_MARCHE_NATIONAL
                                     AND EJ.CODE_UAG = MAPU.code_uag)
FROM MAPU,
    (SELECT DISTINCT id_marche,CODE_MARCHE_NATIONAL FROM marche
      WHERE CODE_STATUT = 'N'
        AND CODE_PRM <> '02') V_MARCHE,  PERIODE     
WHERE MAPU.id_marche = V_MARCHE.id_marche
  AND MAPU.ID_PERIODE = PERIODE.ID_PERIODE;
END p_test1;
> procédure créée
donc en 10g, ca marche
t'as pas fait une erreur typographique par hasard ? (virgule en trop ou en moins par exemple)
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 16h56   #10
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
est-ce que la requête suivante marche en Oracle 8?

Je crois que ça été introduit en 8i

Code :
1
2
 
SELECT 1 - (SELECT 2 FROM dual) FROM dual
si ça plante, alors if faut enlever ta sous-requête de la clause SELECT et la mettre dans la clause FROM
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2007, 08h58   #11
Membre actif
 
Inscription : novembre 2004
Messages : 311
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 311
Points : 157
Points : 157
Je suis bien en 8i, mais je vais essayer quand même ta proposition.

Merci beaucoup !
davy.g est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h22.


 
 
 
 
Partenaires

Hébergement Web