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 :

CAST d'une table problèmatique [11gR2]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Par défaut CAST d'une table problèmatique
    Bonjour à tous,

    En cette fin de semaine je ne pensais pas tomber sur un problème de SQL.

    J'explique :

    Je suis sur Oracle 11g.

    J'ai un type de table MONTYPEDETABLE défini ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create or replace TYPE  "MONTYPEDETABLE" AS TABLE OF VARCHAR2(4000);
    Et j'effectue la requête suivante :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    SELECT * FROM (
      SELECT
        d.code_dest,
        l.id_livraison,
        l.code_livr,
        l.nom_lieu_livr,
        l.pays_livr
      FROM
        LIVRAISON l, 
        DESTINATAIRES d
      WHERE
        l.id_destinataire = d.id_destinataire
    ) 
    QRSLT  WHERE ( 
      ( 
        code_dest MEMBER OF (
          CAST ( 
            ( 
              SELECT d2.code_dest from DESTINATAIRES d2 WHERE d2.code_dest='XXXXXX' 
            ) 
            AS MONTYPEDETABLE
          )
        )
      ) 
    ) 
    ORDER BY "CODE_LIVR";
    Une exception est remontée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ORA-00932: types de données incohérents ; attendu : - ; obtenu : CHAR
    00932. 00000 -  "inconsistent datatypes: expected %s got %s"
    *Cause:    
    *Action:
    Erreur à la ligne 19, colonne 17
    L'erreur provient du CAST( ... AS MONTYPEDETABLE).

    Le type de DESTINATAIRES.CODE_DEST est VARCHAR2(20).

    Si vous avez des pistes de correction je prend.

    Merci

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Quel est l'intérêt de passer par un type et member of dans ce cas ?
    Un simple IN suffit, et même un simple filtre suffit.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Par défaut
    Bonne question,

    Y a pas trop d'intérêt si ce n'est que c'est un framework qui me génère la requête SQL.

    Elle a cette tête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT * FROM (SELECT
      d.code_dest,
      l.id_livraison,
      l.code_livr,
      l.nom_lieu_livr,
      l.pays_livr
    FROM
      LIVRAISON l, DESTINATAIRES d
    WHERE
      l.id_destinataire = d.id_destinataire) QRSLT  WHERE ( ( code_dest MEMBER OF (CAST (:CodesDestinataires AS MONTYPEDETABLE)) ) ) ORDER BY "CODE_LIVR"
    J'ai simplement remplacé la variable CodeDestinataires (qui un tableau de String en Java) par un SELECT.
    La partie verte, je ne peut pas la toucher.

    J'ai tenté le IN (:CodesDestinataires) simple mais ça ne fonctionne pas.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Y a pas trop d'intérêt si ce n'est que c'est un framework qui me génère la requête SQL.
    Donc il y a un intérêt.
    As tu essayé sans CAST ? Sinon regarde binding in-lists in 10g au cas où ça te débloque.

  5. #5
    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
    Il vous manque un multiset
    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
    16
    17
    18
    19
    20
    21
    22
    SELECT * FROM (
      SELECT
        d.department_name,
        e.first_name
      FROM
        hr.employees e, 
        hr.departments d
      WHERE
        e.department_id = d.department_id
    ) 
    QRSLT  WHERE ( 
      ( 
        department_name MEMBER OF (
          CAST ( 
            multiset (           SELECT d2.department_name FROM hr.departments d2 WHERE d2.department_id = 10 
            ) 
            AS MONTYPEDETABLE
          )
        )
      ) 
    )

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Par défaut
    Merci pour le multiset. Je connaissais pas. La requête passe mais JDBC me renvoie une erreur.

    Après recherche j'ai trouvé peu de chose et ne voyant pas de solution simple, j'ai donc tout refait la partie en Java/ADF pour au final avoir un IN ('XXXX', ...).

    C'est plus compréhensible, plus maintenable (côté Java) et ça fonctionne.

    Merci pour votre aide.

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

Discussions similaires

  1. [A-03] MAJ problématique d'une table
    Par funkyjul dans le forum VBA Access
    Réponses: 7
    Dernier message: 16/01/2009, 09h57
  2. Trouver le dernier enregistrement d'une table
    Par remi59 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/03/2003, 14h54
  3. Erreur lors de modification d'une table
    Par seb.49 dans le forum SQL
    Réponses: 11
    Dernier message: 13/01/2003, 17h16
  4. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 12h05
  5. [ADO] Tester l'existence d'une table
    Par nd25 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/09/2002, 13h55

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