IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

ORA-00902 sur un forall avec treat


Sujet :

SQL Oracle

  1. #1
    Membre confirmé Avatar de gaboo_bl
    Profil pro
    Inscrit en
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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.

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    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 ?

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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 ?

  5. #5
    Membre confirmé Avatar de gaboo_bl
    Profil pro
    Inscrit en
    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
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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.

  7. #7
    Membre confirmé Avatar de gaboo_bl
    Profil pro
    Inscrit en
    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
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur ORA-01019 sur SQR (pc avec oracle 8 et oracle 11)
    Par Thomf dans le forum Connexions aux bases de données
    Réponses: 3
    Dernier message: 19/05/2014, 16h20
  2. Réponses: 6
    Dernier message: 08/11/2010, 10h52
  3. question general sur triggers (liaison avec VB)
    Par DaxTaz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2004, 15h57
  4. Problème sur une cmd avec AWK
    Par OrangeBud dans le forum Linux
    Réponses: 3
    Dernier message: 02/06/2004, 10h51
  5. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo