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
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    16 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    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 738
    Points : 33 887
    Points
    33 887
    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.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  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 283
    Points
    2 283
    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"
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    mai 2002
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 055
    Points : 30 722
    Points
    30 722
    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
                ,   ...
                )
    ;
    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    1 073
    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 073
    Points : 1 807
    Points
    1 807
    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
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    16 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    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 738
    Points : 33 887
    Points
    33 887
    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.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/10/2007, 17h34
  2. parseInt-->valeur trop grande ?
    Par blackstrobe dans le forum Langage
    Réponses: 1
    Dernier message: 27/07/2007, 10h02
  3. Import de données depuis GL_interface
    Par jackazerty dans le forum Oracle
    Réponses: 1
    Dernier message: 15/03/2007, 22h06
  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, 15h52
  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, 11h19

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