Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Forms
Forms Forum d'entraide sur Oracle Forms
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 09/05/2006, 11h05   #1
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Par défaut [forms 6i] EXEC_SQL et erreur ORA-xxx

Salut tout le monde,

Je développe depuis quelques mois sous forms 6i et lorsque j'utilise le package EXEC_SQL pour exécuter une requête construite dynamiquement, j'obtiens souvent le message d'erreur suivant :
Citation:
FRM-40735 le déclencheur KEY-MENU a détecté une exception ORA-306500 non traitée.
L'erreur ORA-306500 n'est pas répertoriée parmi les erreurs oracle et, de plus, si je récupère la requête et que je l'exécute sous SQLPlus, j'obtiens bien souvent un message d'erreur plus explicite.
Ex :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
8i CYRIL> SELECT   B2821.T37_CODE, TA_LIB, SPEC_MIN, SPEC_CIBLE, SPEC_MAX
  2  FROM     B2820, B2821, B0300 B0337 
  3  WHERE    B2820.SPEC_CODE  = B2821.SPEC_CODE 
  4  AND      B2821.T37_CODE  = TA_CODE 
  5  AND      TA_TABLE     = '37'
  6  AND      TA_ACTI      = '0'
  7  AND      B0337.T37_CODE  = TA_CODE 
  8  AND      ST_CODE      = '50008906600010NE001'
  9  AND     CL_CODE      = 'DUPONT'
 10  ORDER BY  T37_ORDRE
 11  /
ORDER BY  T37_ORDRE
          *
ERROR à la ligne 10 :
ORA-00904: invalid COLUMN name
Une fois que j'ai récupéré ce message d'erreur plus explicite, je peux corriger mon erreur rapidement.

Par conséquent, je souhaiterais donc être capable de récupérer l'erreur Oracle la plus explicite avec EXEC_SQL (en l'occurence ORA-00904).
Comment faire ?

Merci d'avance.
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2006, 11h16   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Essayez d'ajouter cette section Exception:

Code :
1
2
3
4
5
6
EXCEPTION
WHEN EXEC_SQL.Package_Error THEN
MESSAGE('Code: ' || EXEC_SQL.Last_Error_Code || ' Msg: ' || 
                             EXEC_SQL.Last_Error_Mesg || ' Position: ' || 
                             EXEC_SQL.Last_Error_Position );
END;
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2006, 11h40   #3
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Parfait.

Voici le code pour les éventuels utilisateurs qui passeraient par là :
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
PROCEDURE CHARGER_SPEC_RECETTES IS
 LConn_conn_id     EXEC_SQL.CONNTYPE;
 LCu_spec       EXEC_SQL.CURSTYPE;
 LC_sql_stmt      VARCHAR2(500);
 LI_nIgn        PLS_INTEGER;
 LC_t37_code  B2821.T37_CODE%TYPE;
 LC_ta_lib   B0300.TA_LIB%TYPE;
 LC_spec_min  B2821.SPEC_MIN%TYPE;
 LC_spec_cible B2821.SPEC_CIBLE%TYPE;
 LC_spec_max  B2821.SPEC_MAX%TYPE;
BEGIN
 -- il faut effacer le contenu du bloc avant de le recharger
 CLEAR_BLOCK;
  IF :B2.TRA_ST_LEX IS NOT NULL THEN
  BEGIN
   LConn_conn_id := EXEC_SQL.DEFAULT_CONNECTION;
   LCu_spec    := EXEC_SQL.OPEN_CURSOR(LConn_conn_id);
   LC_sql_stmt  := ' SELECT   B2821.T37_CODE, ' ||
            '       TA_LIB, ' ||
            '       SPEC_MIN, ' ||
            '       SPEC_CIBLE, ' ||
            '       SPEC_MAX ' ||
             ' FROM     B2820, ' ||
            '        B2821, ' ||
            '        B0300, ' ||
            '        B0337 ' ||
            ' WHERE    B2820.SPEC_CODE  = B2821.SPEC_CODE ' ||
            ' AND      B2821.T37_CODE  = TA_CODE ' ||
            ' AND      TA_TABLE     = ''37'' ' ||
            ' AND      TA_ACTI      = ''0'' ' ||
            ' AND      B0337.T37_CODE  = TA_CODE ' ||
            ' AND      ST_CODE      = ''' || :B2.TRA_ST_LEX || ''' ';
   IF :B2.TRA_LEX_CL_CODE IS NOT NULL THEN
    LC_sql_stmt := LC_sql_stmt ||
            ' AND       CL_CODE      = ''' || :B2.TRA_LEX_CL_CODE || ''' ';
   ELSE
    LC_sql_stmt := LC_sql_stmt ||
            ' AND       CL_CODE IS NULL ';
   END IF;
   LC_sql_stmt  := LC_sql_stmt ||
            ' ORDER BY  T37_ORDRE';
 
   EXEC_SQL.PARSE(LConn_conn_id, LCu_spec, LC_sql_stmt);
   EXEC_SQL.DEFINE_COLUMN(LConn_conn_id, LCu_spec, 1, LC_t37_code,  5);
   EXEC_SQL.DEFINE_COLUMN(LConn_conn_id, LCu_spec, 2, LC_ta_lib,   30);
   EXEC_SQL.DEFINE_COLUMN(LConn_conn_id, LCu_spec, 3, LC_spec_min);
   EXEC_SQL.DEFINE_COLUMN(LConn_conn_id, LCu_spec, 4, LC_spec_cible);
   EXEC_SQL.DEFINE_COLUMN(LConn_conn_id, LCu_spec, 5, LC_spec_max);
 
   LI_nIgn := EXEC_SQL.EXECUTE(LConn_conn_id, LCu_spec);
   FIRST_RECORD;
   WHILE ( EXEC_SQL.FETCH_ROWS(LConn_conn_id, LCu_spec) > 0 ) LOOP
    CREATE_RECORD;
 
    EXEC_SQL.COLUMN_VALUE(LConn_conn_id, LCu_spec, 1, :B4.T37_CODE);
    EXEC_SQL.COLUMN_VALUE(LConn_conn_id, LCu_spec, 2, :B4.TA_LIB);
    EXEC_SQL.COLUMN_VALUE(LConn_conn_id, LCu_spec, 3, :B4.SPEC_MIN);
    EXEC_SQL.COLUMN_VALUE(LConn_conn_id, LCu_spec, 4, :B4.SPEC_CIBLE);
    EXEC_SQL.COLUMN_VALUE(LConn_conn_id, LCu_spec, 5, :B4.SPEC_MAX);
 
    DESACTIVER_ITEM('B4.TA_LIB');
    DESACTIVER_ITEM('B4.SPEC_MIN');
    DESACTIVER_ITEM('B4.SPEC_CIBLE');
    DESACTIVER_ITEM('B4.TRA_VAL_SIM');
    DESACTIVER_ITEM('B4.SPEC_MAX');
   END LOOP;
 
   EXEC_SQL.CLOSE_CURSOR(LConn_conn_id, LCu_spec);
   EXEC_SQL.CLOSE_CONNECTION(LConn_conn_id);
  EXCEPTION WHEN EXEC_SQL.PACKAGE_ERROR THEN
   MSG_BOX('Code : ' || EXEC_SQL.LAST_ERROR_CODE || CHR(10) ||
       'Message : ' ||  EXEC_SQL.LAST_ERROR_MESG || CHR(10) ||
       'Position : ' || EXEC_SQL.LAST_ERROR_POSITION);
   EXEC_SQL.CLOSE_CURSOR(LConn_conn_id, LCu_spec);
   EXEC_SQL.CLOSE_CONNECTION(LConn_conn_id);
  END;
  END IF;
END;
Encore une dernière question : je n'ai pas lu tous vos articles mais il ne me semble pas avoir vu d'exemple de cette gestion d'exceptions ; ma mémoire me joue t'elle des tours ou aucun de vos articles n'en parle ?
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2006, 11h45   #4
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Dans le Guide PL/SQL, je parle de la section Exception.
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2006, 12h14   #5
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Citation:
Envoyé par SheikYerbouti
Dans le Guide PL/SQL, je parle de la section Exception.
Ok, merci pour tout.
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h01.


 
 
 
 
Partenaires

Hébergement Web