Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 26/06/2008, 16h16   #1
Nouveau Membre du Club
 
Avatar de gaboo_bl
 
Inscription : août 2006
Messages : 67
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2006
Messages : 67
Points : 37
Points : 37
Par défaut ORA-00902 sur un forall avec treat

Bonjour à tous,

j'ai petit problème bizarre avec un bout de code que je viens d'écrire, et que je vous soumets. J'essaye de faire un update dans un forall avec une collection et à la compilation j'ai une erreur invalid datatype.

ce qui est bizarre c'est que cette erreur semble d'habitude se produire dans des ordres DDL : ORA-00902

Voici le code:

D'abord j'ai créé les types et variable suivants
Code :
1
2
3
4
5
6
7
8
9
TYPE negs IS RECORD (
    nucon  hisneg.nucon%type,
    coinf  hisneg.coinf%type
  );
 
TYPE negs_tab IS TABLE OF negs
    INDEX BY BINARY_INTEGER;
 
waitNegList negs_tab;
ensuite divers traitements, puis le code qui me pose problème:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT nucon, coinf bulk collect
  INTO waitNegList
  FROM bnp_tmp_tradfeed_tmp td
  JOIN (SELECT nubix, nucon, coinf
          FROM hisneg
        union
        SELECT nubix, nucon, coinf FROM ficneg) neg ON neg.nucon = td.nocon
 WHERE neg.coinf IN ('WAITPAR', 'WAITLON')
   AND neg.nubix NOT IN (SELECT nubix FROM anuptf);
 
forall x IN waitNegList.first .. waitNegList.last
  UPDATE bnp_tmp_tradfeed_tmp
     SET coctp = treat(waitNegList(x) AS negs).coinf
   WHERE nocon = treat(waitNegList(x) AS negs).nucon;
J'ai bien vérifié l'erreur est liée à l'ordre update (quand je le commente la fonction compile bien).
Pour ceux qui se demande à quoi servent les treat, je suis sous oracle 9.2 et je les ajoutés comme workaround à l'erreur PLS-00436 en suivant cette page

Voilà donc quelqu'un saurait il m'expliquer pourquoi j'ai cette erreur et éventuellement comment y remédier?

Merci d'avance.
gaboo_bl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 16h29   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
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 320
Points : 5 839
Points : 5 839
Si tu regardes avec attention l’exemple du lien qu t’a fourni tu verra que le TREAT s’applique à un OBJECT et non pas à un RECORD.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 16h33   #3
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
coctp et nocon ne sont pas de type negs alors forcément ça fonctionne pas

Pourquoi tu fais un AS negs et pas AS coctp ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 16h55   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
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 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par orafrance Voir le message
coctp et nocon ne sont pas de type negs alors forcément ça fonctionne pas

Pourquoi tu fais un AS negs et pas AS coctp ?
Salut orafrance,
T'as lu l'exemple en suivant le lien fourni ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 16h58   #5
Nouveau Membre du Club
 
Avatar de gaboo_bl
 
Inscription : août 2006
Messages : 67
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2006
Messages : 67
Points : 37
Points : 37
mnitu > Très juste, j'avais pas vu. Ça expliquerait le problème de type invalide. Mais je ne vois pas comment créer un objet dans ma fonction PL/SQL. Faut que je creuse un peu dans ce sens car j'ai encore jamais travaillé avec le type object sur oracle.

orafrance> coinf et coctp et nocon et nucon on des types similaires entre eux, et comme negs_tab est un tableau de negs, çà me paraîtrait logique que negs_tab(x) soit du même type que negs. Du coup à la base il ne me semblait pas qu'il y ait de problème de compatibilité. Cela dit j'ai quand même essayé

Code :
1
2
3
UPDATE bnp_tmp_tradfeed_tmp
     SET coctp = treat(waitNegList(x).coinf AS coctp)
   WHERE nocon = treat(waitNegList(x).nucon AS nocon);
et même erreur.
gaboo_bl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 17h03   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
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 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par gaboo_bl Voir le message
mnitu > Très juste, j'avais pas vu. Ça expliquerait le problème de type invalide. Mais je ne vois pas comment créer un objet dans ma fonction PL/SQL. Faut que je creuse un peu dans ce sens car j'ai encore jamais travaillé avec le type object sur oracle.
....
C'est simple, comme dans l'exemple . Un objet c'est un nouveau TYPE des données () donc tu doit le créer au niveau de ton schéma par sqlplus.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 17h09   #7
Nouveau Membre du Club
 
Avatar de gaboo_bl
 
Inscription : août 2006
Messages : 67
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2006
Messages : 67
Points : 37
Points : 37
Ok j'ai trouvé la soluce grâce à l'œil perçant de mnitu.

A priori je n'ai pas l'impression qu'il soit possible de créer des type as object dans une fonction PL comme je le faisait pour le type RECORD, j'ai donc retiré mes déclaration de types et fait:

Code :
1
2
3
4
5
6
7
 
CREATE type negs AS object
(      
       nucon  number(10),
       coinf  varchar2(8)
);
CREATE type negs_tab AS TABLE of negs;
Pour la fonction j'ai dû modifier mon select:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SELECT negs(nucon, coinf) bulk collect
  INTO waitNegList
  FROM bnp_tmp_tradfeed_tmp td
  JOIN (SELECT nubix, nucon, coinf
          FROM hisneg
        union
        SELECT nubix, nucon, coinf FROM ficneg) neg ON neg.nucon = td.nocon
 WHERE neg.coinf IN ('WAITPAR', 'WAITLON')
   AND neg.nubix NOT IN (SELECT nubix FROM anuptf);
 
forall x IN waitNegList.first .. waitNegList.last
  UPDATE bnp_tmp_tradfeed_tmp
     SET coctp = treat(waitNegList(x) AS negs).coinf
   WHERE nocon = treat(waitNegList(x) AS negs).nucon;
Et là çà compile -enfin- bien. Après reste à savoir si ce que j'ai fait fonctionne, mais bon çà c'est une autre histoire

merci à vous deux pour votre aide.

EDIT: mnitu> Oui en fait j'ai usé de cette solution pendant que tu la postais .
gaboo_bl 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 20h58.


 
 
 
 
Partenaires

Hébergement Web