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 21/06/2011, 15h03   #1
Membre régulier
 
Inscription : mars 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 39
Localisation : Belgique

Informations forums :
Inscription : mars 2007
Messages : 88
Points : 83
Points : 83
Par défaut PLS-320 à cause d'un mauvais nom de colonne

Bonjour,

Je travaille avec Oracle 9.

J'ai fait des recherches et j'ai déja trouvé la cause de mon problème... il ne faut plus qu'une autre solution que celle que j'ai trouvé déja.

J'ai une table (dont je ne suis pas owner et que je ne peux donc pas modifier) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE BIQ_PERFORMANCE_TMP
(
  ID              NUMBER(19) NOT NULL,
  STATE_NAME      VARCHAR2(255 CHAR) NOT NULL,
  STATE           NUMBER(10) NOT NULL,
  USER_ID         VARCHAR2(255 CHAR) NOT NULL,
  TRANSACTION_ID  VARCHAR2(255 CHAR),
  HTTP_SESSION_ID VARCHAR2(255 CHAR),
  DN              VARCHAR2(255 CHAR),
  OSS_PORT        VARCHAR2(255 CHAR),
  OPERATION_TYPE  VARCHAR2(255 CHAR),
  OPERATION_NAME  VARCHAR2(255 CHAR),
  TIMESTAMP       TIMESTAMP(0),
  PARENT_ID       NUMBER(19)
)
je dois créer une store procedure utilisant cette table. A un moment, je dois savoir qu'elle est le record le plus récent inséré dans la table :
Code :
1
2
3
4
5
6
7
8
  procedure GET_DELTA IS
    v_biq_timestamp TIMESTAMP(0);
                       ....
begin
                       ....
   SELECT max(timestamp) INTO v_biq_timestamp FROM biq_performance_tmp;
                       ....
end GET_DELTA;
La compilation plante inexorablement à cet endroit là avec l'erreur :
Code :
1
2
3
4
5
6
7
8
Error: PL/SQL: ORA-06552: PL/SQL: Compilation unit analysis terminated
       ORA-06553: PLS-320: the declaration of the type of this expression IS incomplete OR malformed
Line: 129
Text: SELECT max(timestamp) INTO v_biq_timestamp FROM biq_performance_tmp;
 
Error: PL/SQL: SQL Statement ignored
Line: 129
Text: SELECT max(timestamp) INTO v_biq_timestamp FROM biq_performance_tmp;
L'erreur est due au fait qu'un des champs de la table biq_performance_tmp s'appelle timestamp (qui est mot réservé). Ce n'est pas une bonne pratique d'utiliser des mots réservés comme nom de champ, mais je ne fais qu'utiliser la table, je ne l'ai pas crée et je ne peux pas la modifier.

Une solution serait de créer une vue sur la table en donnant un autre nom au champ qui m'embête, mais cela me parait un peu comme utiliser un rouleau compresseur pour repasser une chemise.

Une idée pour contourner ce problème ?

Merci de votre aide
rafuoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 15h55   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
Peut-être en encadrant le nom de colonne avec des apostrophes et en le préfixant par le nom ou l'alias de la table...
Code :
1
2
3
SELECT max(tmp."timestamp") 
INTO v_biq_timestamp 
FROM biq_performance_tmp tmp
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 16h39   #3
Membre régulier
 
Inscription : mars 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 39
Localisation : Belgique

Informations forums :
Inscription : mars 2007
Messages : 88
Points : 83
Points : 83
Par défaut et non....

Al1_24,

merci pour la réponse. Hélas cela ne fonctionne pas.

J'avais déja essayé les quotes (ce que je n'ai pas signalé dans la description du problème).

J'ai meme essayé ceci :
Code :
SELECT max(field1) INTO v_biq_timestamp FROM (SELECT timestamp AS field1 FROM biq_performance_tmp)
cela fonctionne parfaitement en exécutant le sql (sans le INTO) hors store procedure, mais pas comme-ci dessus dans la SP

grrrrrr...
rafuoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 17h07   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 810
Points : 5 810
Pour l'instant utilisez un execute immediate à la place du sql statique.

[Edit]
Mais il sera sage de changer le nom de la colonne.
[/Edit]
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/06/2011, 17h46   #5
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 433
Points : 10 433
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Je ne reproduis pas votre problème :
Code :
1
2
3
4
5
6
7
8
9
SELECT banner FROM sys.v_$version;
 
BANNER                                                          
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production      
PL/SQL Release 9.2.0.8.0 - Production                           
CORE	9.2.0.8.0	Production                                       
TNS FOR 32-bit Windows: Version 9.2.0.8.0 - Production          
NLSRTL Version 9.2.0.8.0 - Production
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
CREATE TABLE t1 
(
    col       number(1),
    timestamp timestamp(0)
);
-- Table created.
 
INSERT INTO t1 VALUES (1, systimestamp);
-- 1 row created.
 
SELECT col, timestamp FROM t1;
 
       COL TIMESTAMP                    
---------- -----------------------------
         1 21/06/11 17:45:47            
-- 1 row selected.
 
declare
    v_biq_timestamp TIMESTAMP(0);
begin
    SELECT max(timestamp) INTO v_biq_timestamp FROM t1;
    dbms_output.put_line(to_char(v_biq_timestamp));
end;
-- PL/SQL procedure successfully completed.
 
21/06/11 17:45:47
 
DROP TABLE t1;
-- Table dropped.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 17h55   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Waldar essaie en créant une procédure et pas simplement dans un bloc anonyme.

Par exemple, je crois que les droits fournis via un rôle sont utilisables dans un bloc anonyme alors qu'il faut qu'ils soient données en direct pour une procédure stockée.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 18h04   #7
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 433
Points : 10 433
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Bien vu skuatamad, mais au final ça n'a pas posé de problème non plus :
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
CREATE TABLE t1 
(
    col       number(1),
    timestamp timestamp(0)
);
-- Table created.
 
INSERT INTO t1 VALUES (1, systimestamp);
INSERT INTO t1 VALUES (2, systimestamp+1);
-- 2 rows created.
 
commit;
-- Commit complete.
 
SELECT col, timestamp FROM t1;
-- 2 rows selected.
 
CREATE procedure GET_DELTA
IS
    v_biq_timestamp TIMESTAMP(0);
begin
    SELECT max(timestamp) INTO v_biq_timestamp FROM t1;
    dbms_output.put_line(to_char(v_biq_timestamp));
end GET_DELTA;
-- Procedure created.
 
begin
    GET_DELTA;
end;
-- 22/06/11 18:01:32
-- PL/SQL procedure successfully completed.
 
DROP procedure GET_DELTA;
-- Procedure dropped.
 
DROP TABLE t1;
-- Table dropped.
Après, c'est peut-être quelque chose qui a été corrigé dans un des patchs Oracle, ou alors c'est ailleurs dans le code !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 09h12   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 810
Points : 5 810
Procedure ou block PL/SQL ne change rien dans ce cas, c'est la même chose.
Par contre la version compte (même erreur en 10.2.0.4.0).
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
 
Connected TO Oracle9i Enterprise Edition Release 9.2.0.5.0 
Connected AS mni
 
SQL> DROP TABLE t1;
 
DROP TABLE t1
 
ORA-00942: TABLE ou vue inexistante
 
SQL> 
SQL> CREATE TABLE t1
  2  (
  3      col       number(1),
  4      timestamp timestamp(0)
  5  );
 
TABLE created
 
SQL> 
SQL> INSERT INTO t1 VALUES (1, systimestamp);
 
1 row inserted
SQL> INSERT INTO t1 VALUES (2, systimestamp+1);
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> SELECT col, timestamp FROM t1;
 
COL TIMESTAMP
--- -------------------------------------------------
  1 22/06/11 09:18:23
  2 23/06/11 09:18:23
 
SQL> 
SQL> CREATE procedure GET_DELTA
  2  IS
  3      v_biq_timestamp TIMESTAMP(0);
  4  begin
  5      SELECT max(timestamp) INTO v_biq_timestamp FROM t1;
  6      dbms_output.put_line(to_char(v_biq_timestamp));
  7  end GET_DELTA;
  8  /
 
Warning: Procedure created WITH compilation errors
 
SQL> SHOW err
Errors FOR PROCEDURE MNI.GET_DELTA:
 
LINE/COL ERROR
-------- -------------------------------------------------------------------------------------------------------------------------------------------------------------
5/53     PL/SQL: ORA-06552: PL/SQL: Compilation unit analysis terminated  ORA-06553: PLS-320: déclaration de type de cette expression est incomplète ou mal structurée
5/5      PL/SQL: SQL Statement ignored
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 13h35   #9
Membre régulier
 
Inscription : mars 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 39
Localisation : Belgique

Informations forums :
Inscription : mars 2007
Messages : 88
Points : 83
Points : 83
Par défaut execute immediate fonctionne

Primo : merci pour toutes les réponses.

Ensuite Waldar, mnitu a raison. Je ne peux pas créer une procédure stockées qui ne me donne pas cette erreur. Peu importe la manière dont je la crée.

En revanche, la solution de mnitu qui consiste à remplacer le select into par un execute immediate into fonctionne à merveille :
Code :
1
2
    sqlstr := 'SELECT max(t.timestamp) FROM biq_performance_tmp t';
    execute immediate sqlstr INTO v_biq_timestamp;
Je suis d'accord que dans le meilleur des mondes je devrais pouvoir changer le nom du champ, mais ce n'est pas possible pour l'instant. Donc ceci va me sauver la mise.

J'ai fait la remarque au developpeur qui a crée cette table, et il ignorait ce problème. En voila un qui ne fera plus l'erreur

merci a vous tous !
rafuoner 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 22h52.


 
 
 
 
Partenaires

Hébergement Web