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 31/01/2008, 09h42   #1
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Par défaut Erreur d'exécution d'un trigger et option manquante ?

Bonjour,

Je rencontre le problème suivant dont j'aimerais que vous m'aidiez à comprendre.
Code :
1
2
3
4
5
6
INSERT INTO RANDRIANO.RDR_MYClasses (ID, Name, Type) VALUES (RANDRIANO.mypkg_guid.guidclass,'Class 4', '4')
 
ORA-00922: OPTION erronée ou absente
ORA-06512: à "RANDRIANO.RDR_CREATETAB", ligne 11
ORA-06512: à "RANDRIANO.A_I_RDR_MYClasses", ligne 75
ORA-04088: erreur lors d'exécution du déclencheur 'RANDRIANO.A_I_RDR_MYClasses'
Les codes correspondants a ce trigger et à cette procédure est:

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
93
 
CREATE OR REPLACE  PROCEDURE RANDRIANO."RDR_CREATETAB"  (v_tab
    varchar2)
 
IS
    v_cdef varchar2 (256);
 
pragma autonomous_transaction;
 
begin
 
	 EXECUTE IMMEDIATE
   'CREATE TABLE  ' || v_tab ||
   ' ( idequipment varchar2(38) PRIMARY KEY)';
 
end;
 
CREATE OR REPLACE TRIGGER RANDRIANO."A_I_RDR_MYCLASSES" AFTER
INSERT ON RANDRIANO.RDR_MYCLASSES FOR EACH ROW Declare
	v_Name varchar2 (256);
	v_Type int;
	v_TableName varchar2 (512);
	v_DEFTableName varchar2 (512);
	 v_ColumnName varchar2 (512);
	v_ColumnType varchar2 (512);
	v_ColumnTypeChar varchar2 (512);
	v_ColumnPrecision int;
	v_ColumnHasPrecision number(1);
	v_IsNullable varchar2(25);
	v_Default varchar2 (256);
	v_ColumnDEFAULT varchar2 (4000);
	v_fk_name varchar2(30);
	v_namefk varchar2(23);
	v_fk_name1 varchar2(30);
	v_namefk1 varchar2(14);
	v_cdef varchar2(256);
 
 
 
 
 
BEGIN
 
PKG_UPDATEAVAINS.v_compt := PKG_UPDATEAVAINS.v_compt+1;
--dbms_output.put_line('ici');
 
SELECT :new.name CLE INTO v_name FROM dual RDR_MYCLASSES;
 
SELECT :new.type CLE INTO v_type FROM dual RDR_MYCLASSES;
 
 
 
v_TableName := 'RDR_ATT_Equi_'||v_Name;
 
-- begin if 
 
IF (v_Type = 1) then
		v_DEFTableName := 'EQUIPMENT';
end IF;
	IF (v_Type = 2) then
		v_DEFTableName := 'TYPE';
		end IF ;
	IF (v_Type = 4)then
		v_DEFTableName := 'RDR_VARS';
		end IF;
	IF (v_Type = 8)then
		v_DEFTableName := 'PLUGMAP';
		end IF ;
	IF (v_Type = 16) then
		v_DEFTableName := 'CONNECTION';
		end IF ;
	IF (v_Type = 32)then
		v_DEFTableName:= 'RULE';
		end IF ;
	IF (v_Type = 64) then
		v_DEFTableName := 'ACCESS';
		end IF ;
 
	IF (v_Type = 128) then
		v_DEFTableName := 'OBJ_DEF';
		end IF ;
 
	IF (v_Type = 256) then
		v_DEFTableName := 'SIMUL';
		end IF ;
 
--end if 
 
--create table class
 
v_tablename := substr(v_tablename,1,30);
 
rdr_createtab(v_TableName); -- ligne n° 75 de ce trigger
Je me demande si c'est un problème de casse ou bien un problème de roles c'est à dire de GRANT mais je remarque que le schéma ne doit pas être un schéma système (sysman)
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 09h59   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
t'es un grand garçon quand même... le débugage on peut pas le faire pour toi, on a pas accès à ta base de donnée et apparemment le trigger n'est pas complet

En tout cas, en terme d'écriture on peut déjà signaler 2 SELECT inutiles et du coup 2 variables en plus qui ne servent à rien. Des IF à gogo au lieu de CASE. Rend le plus lisible et tu trouveras surement l'erreur tout seule... un bon moyen de débugger est d'exécuter le code à la main dans un session pour commencer.

Edit : à tout hasard je dirais bien qu'il est possible que tu envoies NULL dans le paramètre de ta procédure
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 10h02   #3
Responsable Business Intelligence
 
Avatar de kalyparker
 
Femme
Consultant en Business Intelligence
Inscription : janvier 2007
Messages : 1 192
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : janvier 2007
Messages : 1 192
Points : 2 564
Points : 2 564
Bonjour,

Il semble que l'erreur vienne du trigger A_I_EED_SET_CLASSES, dont on n'a pas le code
kalyparker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 10h03   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est pas faux
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 12h38   #5
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Bon, désolé j'ai posté le mauvais rapport d'erreur. Maintenant c'est le bon, voir le 1er message !!
J'ai copié le code jusqu'au point où l'erreur se produit c'est à dire la ligne 75 un appel à une procédure !!!
orafrance ! Je n'ai pas l'intention de profiter des gens pour déboguer mon code mais je me demande si cette erreur est courante et qui en a l'expérience
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 13h43   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
cette erreur est en effet courante mais dépend complètement du code. Relis mon message et suis mes recommandations
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 14h07   #7
Responsable Business Intelligence
 
Avatar de kalyparker
 
Femme
Consultant en Business Intelligence
Inscription : janvier 2007
Messages : 1 192
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : janvier 2007
Messages : 1 192
Points : 2 564
Points : 2 564
Pour info :
PL/SQL n'est pas case-sensitive

Le problème ne viens donc pas de là.

Pour le reste j'ai un peu de mal à me mettre dedans...
kalyparker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 14h50   #8
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Pour être plus clair,
ORA-06512: à "RANDRIANO.A_I_RDR_MYClasses", ligne 75 => il s'agit d'erreur d'exécution de la 75è ligne du trigger A_I_RDR_MYClasses qui est rdr_createtab(v_TableName) !!! J'ai parlé de manque de GRANT car avant, j'avais un problème de privilèges insuffisants pour la création de ce trigger même pour exécuter une procedure de création de table, donc j'ai fait
Code :
GRANT CREATE TABLE TO RANDRIANO;
et ça marchait !
Maintenant le problème c'est lors de l'exécution du trigger même !
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 15h18   #9
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Remplace :

Code :
1
2
3
EXECUTE IMMEDIATE
   'CREATE TABLE  ' || v_tab ||
   ' ( idequipment varchar2(38) PRIMARY KEY)';
Par :

Code :
1
2
DBMS_OUTPUT.PUT_LINE(   'CREATE TABLE  ' || v_tab ||
   ' ( idequipment varchar2(38) PRIMARY KEY)');
Et teste le résultat affiché dans SQL*Plus... on va pas t'apprendre à débogguer quand même
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2008, 08h30   #10
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Ce remplacement conduit à une autre erreur (ORA-01735: option ALTER TABLE non valide). Comme vous l'avez dit, le forum n'est pas pour déboguer mes programmes.
Je me demande seulement à quoi sert ce test par remplacement ?
Dans mon CREATE TABLE, est-il nécessaire de préciser le schéma ou pas ?
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2008, 09h10   #11
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
oui il vaut mieux
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 09h22   #12
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Et bon, comme je le dis toujours dans ma signature
Citation:
Envoyé par randriano
Le bug se situe toujours entre la chaise et le clavier (70 %).
C'est maintenant que je suis au courant qu'Oracle ne supporte pas les ESPACES dans les noms de table :

Code :
INSERT INTO RANDRIANO.RDR_MYClasses (ID, Name, Type) VALUES (RANDRIANO.mypkg_guid.guidclass,'Class 4', '4')
Le trigger de cette classe (AFTER INSERT) fonctionne comme suit : il crée une table RDR_+Type c-à-d ici RDR_Class 4 qui ne se fait pas en Oracle, donc il suffit d'enlever l'espace !!
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 13h43   #13
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
Citation:
Envoyé par kalyparker Voir le message
Pour info :
PL/SQL n'est pas case-sensitive

Le problème ne viens donc pas de là.
Faux :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE FUNCTION "wmc_FTEST" (p1 IN NUMBER)
RETURN NUMBER 
IS
BEGIN
	RETURN p1 * 10;
END;
 
SELECT wmc_FTEST(1)
FROM dual
ORA-00904: "WMC_FTEST": invalid identifier
 
SELECT "wmc_FTEST"(1)
FROM dual
10
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 13h48   #14
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Vrai !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL>CREATE FUNCTION "FTEST" (p1 IN NUMBER)
  2  RETURN NUMBER 
  3  IS
  4  BEGIN
  5   RETURN p1 * 10;
  6  END;
  7  /
 
FUNCTION created.
 
SQL>
SQL>SELECT ftest(1)
  2  FROM dual;
 
  FTEST(1)
----------
        10
Dans le cas présent il n'y a pas de minuscule dans le nom
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 13h57   #15
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
Parce que Oracle passe le nom de ta fonction dans ton select en UPPER.
C'est pas ce que j'appelle du CASE INSENSITIVE

Dans ton cas c'est comme si tu avais codé
Code :
SELECT FTEST(1) FROM DUAL
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 13h59   #16
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Je sais bien, mais dire que Oracle est case-sensitive est également faux. Il l'est uniquement si le nom de l'objet est entre guillemet ce qui n'est pas recommandé
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 17h35   #17
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
Oui en fait Oracle n'est ni l'un, ni l'autre..
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 17h43   #18
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par McM Voir le message
Oui en fait Oracle n'est ni l'un, ni l'autre..
bien au contraire
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 07h00   #19
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Oracle et pl/sql
1) sensible à la casse
2) ne supportant les ESPACES dans les noms de tables ou de procédures

et quoi d'autres ??
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 10h18   #20
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
il me semble qu'un nom d'objet ne peut pas commencer par un chiffre.
orafrance 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 18h14.


 
 
 
 
Partenaires

Hébergement Web