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

PL/SQL Oracle Discussion :

Import de données depuis MariaDB : valeurs trop grandes [12c]


Sujet :

PL/SQL Oracle

  1. #1
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 804
    Points : 34 077
    Points
    34 077
    Billets dans le blog
    14
    Par défaut Import de données depuis MariaDB : valeurs trop grandes
    Bonjour,

    Je viens d'écrire une procédure pour importer des données depuis une vue MariaDB vers une table Oracle via un MERGE.

    Voici l'erreur que j'obtiens :
    ORA-12899: valeur trop grande pour la colonne "ENFA"."ETUDIANT_PEF"."ID_INDIVIDU" (réelle : 52, maximum : 13)
    ORA-06512: à "ENFA.PR_IMPORT_PEF_CARTE_MUT", ligne 36
    ORA-06512: à ligne 2
    La colonne en question a bien une longueur 13 dans les 2 BDD ; comment peut-il me dire qu'il trouve une longueur de 52 ?
    Il n'y a pour le moment que deux lignes à importer et les données sont valides.

    Voici la procédure :
    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
    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
    CREATE OR REPLACE PROCEDURE PR_IMPORT_PEF_CARTE_MUT 
    -- -------------------------------------------------------------------------------------- --
    -- Procédure d'import des étudiants depuis la BDD MariaDB pef pour la vue grhum.v_sgc_etu --
    -- -------------------------------------------------------------------------------------- --
    --
    -- @author : Philippe Leménager
    -- @version : V0.1 - plemenager - 2021-09-07 - Création
    --
    -- Utilise :
    -- - Table enfa.etudiant_pef
    -- - DB_LINK pef
    -- - Vue pef.v_carte_mut sur MariaDB (serveur dev.ensfea.fr en test ou sgbdlan.ensfea.fr en prod)
    -- ----------------------------------------------------------------------------------------------
    IS
        annee_universitaire integer;
        mois_actuel integer;
     
    BEGIN
        -- Calcul de l'année universitaire
        SELECT EXTRACT(MONTH FROM CURRENT_DATE) INTO mois_actuel FROM dual;
     
        IF mois_actuel > 6 THEN 
            SELECT EXTRACT(YEAR FROM CURRENT_DATE) INTO annee_universitaire FROM dual;
        ELSE
            SELECT EXTRACT(YEAR FROM CURRENT_DATE) - 1 INTO annee_universitaire FROM dual;
        END IF;
     
        -- Récupération de la vue pef.v_carte_mut
        MERGE INTO enfa.etudiant_pef e
        USING
        (
            SELECT "id_individu", "civilite", "nom_usuel", "nom_patronymique", "prenom", "date_naissance", "ine", "date_debut_validite", "droit_photo", "droit_import",
                "e_mail", "code_nationalite", "adresse1", "adresse2", "adresse3", "code_postal", "ville", "code_pays", "autre_adresse1", "autre_adresse2", "autre_adresse3", 
                "autre_code_postal", "autre_ville", "autre_code_pays", "telephone1", "telephone2", "niveau", "code_sise_formation", "formation", "echange_internationaux",
                "sens_echange", "date_inscription", "annee_universitaire", "civilite2"
            FROM "v_carte_mut"@pef
            WHERE "annee_universitaire" = annee_universitaire
        ) i
        ON (i."id_individu" = e.id_individu)
        WHEN MATCHED THEN
            UPDATE SET 
                e.civilite = i."civilite",
                e.date_debut_validite = i."date_debut_validite",
                e.droit_photo = i."droit_photo",
                e.droit_import = i."droit_import",
                e.code_nationalite = i."code_nationalite",
                e.adresse1 = i."adresse1",
                e.adresse2 = i."adresse2",
                e.adresse3 = i."adresse3",
                e.code_postal = i."code_postal",
                e.ville = i."ville",
                e.code_pays = i."code_pays",
                e.autre_adresse1 = i."autre_adresse1",
                e.autre_adresse2 = i."autre_adresse2",
                e.autre_adresse3 = i."autre_adresse3",
                e.autre_code_postal = i."autre_code_postal",
                e.autre_ville = i."autre_ville",
                e.autre_code_pays = i."autre_code_pays",
                e.telephone1 = i."telephone1",
                e.telephone2 = i."telephone2",
                e.niveau = i."niveau",
                e.code_sise_formation = i."code_sise_formation",
                e.formation = i."formation",
                e.echange_internationaux = i."echange_internationaux",
                e.sens_echange = i."sens_echange",
                e.date_inscription = i."date_inscription",
                e.annee_universitaire = i."annee_universitaire",
                e.civilite2 = i."civilite2"
        WHEN NOT MATCHED THEN
            INSERT (id_individu, civilite, nom_usuel, nom_patronymique, prenom, date_naissance, ine, date_debut_validite, droit_photo, droit_import, 
                e_mail, code_nationalite, adresse1, adresse2, adresse3, code_postal, ville, code_pays, autre_adresse1, autre_adresse2, autre_adresse3, 
                autre_code_postal, autre_ville, autre_code_pays, telephone1, telephone2, niveau, code_sise_formation, formation, echange_internationaux,
                sens_echange, date_inscription, annee_universitaire, civilite2)
            VALUES (i."id_individu", i."civilite", i."nom_usuel", i."nom_patronymique", i."prenom", i."date_naissance", i."ine", i."date_debut_validite", i."droit_photo", i."droit_import", 
                i."e_mail", i."code_nationalite", i."adresse1", i."adresse2", i."adresse3", i."code_postal", i."ville", i."code_pays", i."autre_adresse1", i."autre_adresse2", i."autre_adresse3", 
                i."autre_code_postal", i."autre_ville", i."autre_code_pays", i."telephone1", i."telephone2", i."niveau", i."code_sise_formation", i."formation", i."echange_internationaux",
                i."sens_echange", i."date_inscription", i."annee_universitaire", i."civilite2");
     
    END PR_IMPORT_PEF_CARTE_MUT;
    Quand j'exécute seulement le SELECT du USING, j'obtiens les bonnes données et l'id_individu a une longueur de 13.

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    En passant ...
    Je cite ce qui me parait être une explication plausible

    "La raison habituelle pour ce type de problèmes, sont des caractères non-ASCII qui peut être représenté par un octet dans la base de données d'origine, mais ont besoin de deux (ou plus) d'octets dans la base de données cible"

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 121
    Points : 28 534
    Points
    28 534
    Par défaut
    Sans doute un problème de représentation différente entre les deux environnements ou de transtypage erroné à travers le DBLINK.

    Tu peux forcer le transtypage, voire ajouter une mise en forme pour certaines colonnes dans la préparation de la source du MERGE.
    Au passage tu peux en profiter pour te débarrasser des questions de casse des noms d'objets.

    Je suppose ici que ton ID est une valeur numérique.
    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
    MERGE INTO enfa.etudiant_pef e
        USING
            (
                SELECT  CAST("id_individu" AS NUMBER(13)) AS id_individu
                    ,   TRIM("civilite")  AS civilite
                    ,   ...
                FROM    "v_carte_mut"@pef
                WHERE   "annee_universitaire" = annee_universitaire
            )   i
        ON  (   i.id_individu = e.id_individu)
        WHEN MATCHED THEN
            UPDATE SET 
                    e.civilite = i.civilite
                ,   ...
        WHEN NOT MATCHED THEN
            INSERT  
                (   id_individu
                ,   civilite
                ,   ...            
                )
            VALUES 
                (   i.id_individu
                ,   i.civilite
                ,   ...
                )
    ;

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 162
    Points : 1 959
    Points
    1 959
    Par défaut
    Bonjour,

    Si la base est en AL32UTF8 il faut savoir qu'un caractère peut nécessiter jusqu'à 4 octets. C'est ce qu'Oracle à l'air de vouloir réserver ici (4 x 13 = 52 octets). Déclare ta colonne ID_INDIVIDU en VARCHAR2(13 CHAR) pour "compter" en caractères plutôt qu'en octets.

  5. #5
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 804
    Points : 34 077
    Points
    34 077
    Billets dans le blog
    14
    Par défaut
    Merci pour vos réponses.
    La transformation des colonnes en VARCHAR2(n CHAR) n'a pas suffi. Il a fallu que je TRIM aussi toutes mes colonnes texte.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/10/2007, 18h34
  2. parseInt-->valeur trop grande ?
    Par blackstrobe dans le forum Langage
    Réponses: 1
    Dernier message: 27/07/2007, 11h02
  3. Import de données depuis GL_interface
    Par jackazerty dans le forum Oracle
    Réponses: 1
    Dernier message: 15/03/2007, 23h06
  4. [MySQL] Importer les données depuis une DB vers une autre
    Par mamiberkof dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 13/03/2007, 16h52
  5. [SQL2005] Import de données depuis Access
    Par l.kieliszak dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/08/2006, 12h19

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