Sql*loader Erreur de chargement avec l'option APPEND
Résolu
sabdoul
Messages postés
47
Statut
Membre
-
sabdoul Messages postés 47 Statut Membre -
sabdoul Messages postés 47 Statut Membre -
Bonjour,
j'ai difficulté concernant le chargement des données avec sql loader avec l'option APPEND.
quand j'insère les données avec l'option REPLACE tous fonctionne normalement. Or j'ai besoin d'insérer les données en mode APPEND pour pourvoir faire un ajout des données aux autres données précédentes.
Voici l'erreur que j'ai:
SQL*Loader-951: Erreur d'appel/initialisation de charge
ORA-26002: Un index est défini sur la table USER.MOUVEMENT
Aussi voici mon fichier de control:
LOAD DATA
APPEND
INTO TABLE MOUVEMENT
FIELDS TERMINATED BY '\t'
TRAILING NULLCOLS
(CODE_ETABL char(10),
CODE_DEPOT char(35),
CODE_PRODUIT char(35),
DESIGNATION char(45),
NUM_LOT char(15),
CODE_MVT char(5),
DATE_MVT "to_date(:DATE_MVT, 'YYYY/MM/DD')",
DATE_PEREMPTION "to_date(:DATE_PEREMPTION, 'YYYY/MM/DD')",
SENS_DOC,
QTE_MVT "TO_NUMBER(:QTE_MVT ,'9999999999.9999')",
VAL_MVT "TO_NUMBER (:VAL_MVT ,'9999999999.9999')",
QTE_AUTRE "TO_NUMBER (:QTE_AUTRE ,'999999999.99999999')",
CODE_ETABL_ORIGINE char(5),
CODE_DEPOT_ORIGINE char(5),
CODE_PRODUIT_ORIGINE char(25),
NUM_LOT_ORIGINE char(15),
QTE_ORIGINE "TO_NUMBER(:QTE_ORIGINE ,'999999999.99999999')" ,
CODE_PRODUIT_TIER char(25),
NOM_CLIENT char(50),
NOM_DEPARTEMENT char(50),
REF_CLI_FOUR char(50),
VAL_VENTE_HT "TO_NUMBER(:VAL_VENTE_HT ,'999999999.99999999')",
VAL_TAXE3 "TO_NUMBER(:VAL_TAXE3 ,'999999999.99999999')",
CODE_UDM char(5),
PCTAGE_REMISE_CLIENT "TO_NUMBER(:PCTAGE_REMISE_CLIENT ,'999999999.99999999')",
MONT_REMISE_CLIENT "TO_NUMBER(:MONT_REMISE_CLIENT ,'999999999.99999999')",
PCTAGE_ESCOMPTE_GLOBAL "TO_NUMBER(:PCTAGE_ESCOMPTE_GLOBAL ,'999999999.99999999')",
PCTAGE_REMISE_FOUR "TO_NUMBER(:PCTAGE_REMISE_FOUR ,'999999999.99999999')",
MONT_REMISE_FOUR "TO_NUMBER(:MONT_REMISE_FOUR ,'999999999.99999999')",
PCTAGE_RISTOURNE_FOUR "TO_NUMBER(:PCTAGE_RISTOURNE_FOUR ,'999999999.99999999')",
MONT_RISTOURNE_FOUR "TO_NUMBER(:MONT_RISTOURNE_FOUR ,'999999999.99999999')",
VAL_ACHAT "TO_NUMBER(:VAL_ACHAT ,'999999999.99999999')",
COUNT_PAR_TONNE "TO_NUMBER(:COUNT_PAR_TONNE ,'999999999.99999999')",
MONT_FRAIS_ACHAT "TO_NUMBER(:MONT_FRAIS_ACHAT ,'999999999.99999999')",
NOM_FOUR char(50),
CODE_TAUX_TVA,
PCTAGE_TVA "TO_NUMBER(:PCTAGE_TVA ,'999999.999999')",
MONT_TVA "to_number(:MONT_TVA, '999999.999999')",
CODE_TAUX_AIRSI,
PCTAGE_AIRSI "to_number(:PCTAGE_AIRSI, '9999.99999')",
MONTANT_AIRSI "to_number(:MONTANT_AIRSI, '9999.99999')",
PRIX_HOMOLOGUE "TO_NUMBER(:PRIX_HOMOLOGUE ,'999999999.99999999')",
GENRE_DOC ,
CODE_DOC_REF char(5),
TITRE_DOC_REF char(30),
NUM_LIGNE_REF ,
NBRE_LIGNES_REF ,
NUM_DOC_REF ,
NUM_PROPOSITION_OU_RES_FAB char(15),
NUM_CDE_OU_OF char(15),
NUM_BL_OU_TRANSFERT char(15),
NUM_FACT_OU_CORRECTION char(15),
POIDS_MVT "TO_NUMBER(:POIDS_MVT,'99999999.9999')",
NUM_COMPTE char(16),
CODE_ANA char(25),
LIBELLE_MVT char(70),
QTE_ANNULATION "TO_NUMBER(:QTE_ANNULATION,'99999999.9999')",
VAL_ANNULATION "TO_NUMBER(:VAL_ANNULATION ,'999999999.99999999')",
ANNULATION_TOTAL ,
TYPE_DOC_ANNULATION char(5),
TITRE_DOC_ANNUL char(30),
NUM_DOC_ANNUL char(15),
NUM_LIGNE_REF_ANNULATION ,
DATE_DOC_ANNULATION Date "yyyy/mm/dd",
CODE_UTILISAT char(15),
CLE_DI char(25),
CLE_DF char(25),
CLE_DC char(25),
PVU "TO_NUMBER(:PVU ,'99999.99999')",
PAU "TO_NUMBER(:PAU ,'99999.99999')",
POIDS_ANNULATION "TO_NUMBER(:POIDS_ANNULATION ,'999999999.99999999')",
CLE_DEPOT,
f1 FILLER,
CLE_LIGNE_DOC_REF
)
je l'appel avec la commmade: sqlldr userid=User/User control=controlMOUV.txt data='C:\Users\AKB\Desktop\export mouv\%%A' log=log%%A bad=bad%%A discard=disard%%A direct=y errors=0 parallel=TRUE
je précise que le %%A est relative a un boucle for dans le fichier batch pour générer des noms de fichier dans le sqlldr.
Merci d'avance pour vos aides précieuses. je ne suis qu'un novice en sql*loader
j'ai difficulté concernant le chargement des données avec sql loader avec l'option APPEND.
quand j'insère les données avec l'option REPLACE tous fonctionne normalement. Or j'ai besoin d'insérer les données en mode APPEND pour pourvoir faire un ajout des données aux autres données précédentes.
Voici l'erreur que j'ai:
SQL*Loader-951: Erreur d'appel/initialisation de charge
ORA-26002: Un index est défini sur la table USER.MOUVEMENT
Aussi voici mon fichier de control:
LOAD DATA
APPEND
INTO TABLE MOUVEMENT
FIELDS TERMINATED BY '\t'
TRAILING NULLCOLS
(CODE_ETABL char(10),
CODE_DEPOT char(35),
CODE_PRODUIT char(35),
DESIGNATION char(45),
NUM_LOT char(15),
CODE_MVT char(5),
DATE_MVT "to_date(:DATE_MVT, 'YYYY/MM/DD')",
DATE_PEREMPTION "to_date(:DATE_PEREMPTION, 'YYYY/MM/DD')",
SENS_DOC,
QTE_MVT "TO_NUMBER(:QTE_MVT ,'9999999999.9999')",
VAL_MVT "TO_NUMBER (:VAL_MVT ,'9999999999.9999')",
QTE_AUTRE "TO_NUMBER (:QTE_AUTRE ,'999999999.99999999')",
CODE_ETABL_ORIGINE char(5),
CODE_DEPOT_ORIGINE char(5),
CODE_PRODUIT_ORIGINE char(25),
NUM_LOT_ORIGINE char(15),
QTE_ORIGINE "TO_NUMBER(:QTE_ORIGINE ,'999999999.99999999')" ,
CODE_PRODUIT_TIER char(25),
NOM_CLIENT char(50),
NOM_DEPARTEMENT char(50),
REF_CLI_FOUR char(50),
VAL_VENTE_HT "TO_NUMBER(:VAL_VENTE_HT ,'999999999.99999999')",
VAL_TAXE3 "TO_NUMBER(:VAL_TAXE3 ,'999999999.99999999')",
CODE_UDM char(5),
PCTAGE_REMISE_CLIENT "TO_NUMBER(:PCTAGE_REMISE_CLIENT ,'999999999.99999999')",
MONT_REMISE_CLIENT "TO_NUMBER(:MONT_REMISE_CLIENT ,'999999999.99999999')",
PCTAGE_ESCOMPTE_GLOBAL "TO_NUMBER(:PCTAGE_ESCOMPTE_GLOBAL ,'999999999.99999999')",
PCTAGE_REMISE_FOUR "TO_NUMBER(:PCTAGE_REMISE_FOUR ,'999999999.99999999')",
MONT_REMISE_FOUR "TO_NUMBER(:MONT_REMISE_FOUR ,'999999999.99999999')",
PCTAGE_RISTOURNE_FOUR "TO_NUMBER(:PCTAGE_RISTOURNE_FOUR ,'999999999.99999999')",
MONT_RISTOURNE_FOUR "TO_NUMBER(:MONT_RISTOURNE_FOUR ,'999999999.99999999')",
VAL_ACHAT "TO_NUMBER(:VAL_ACHAT ,'999999999.99999999')",
COUNT_PAR_TONNE "TO_NUMBER(:COUNT_PAR_TONNE ,'999999999.99999999')",
MONT_FRAIS_ACHAT "TO_NUMBER(:MONT_FRAIS_ACHAT ,'999999999.99999999')",
NOM_FOUR char(50),
CODE_TAUX_TVA,
PCTAGE_TVA "TO_NUMBER(:PCTAGE_TVA ,'999999.999999')",
MONT_TVA "to_number(:MONT_TVA, '999999.999999')",
CODE_TAUX_AIRSI,
PCTAGE_AIRSI "to_number(:PCTAGE_AIRSI, '9999.99999')",
MONTANT_AIRSI "to_number(:MONTANT_AIRSI, '9999.99999')",
PRIX_HOMOLOGUE "TO_NUMBER(:PRIX_HOMOLOGUE ,'999999999.99999999')",
GENRE_DOC ,
CODE_DOC_REF char(5),
TITRE_DOC_REF char(30),
NUM_LIGNE_REF ,
NBRE_LIGNES_REF ,
NUM_DOC_REF ,
NUM_PROPOSITION_OU_RES_FAB char(15),
NUM_CDE_OU_OF char(15),
NUM_BL_OU_TRANSFERT char(15),
NUM_FACT_OU_CORRECTION char(15),
POIDS_MVT "TO_NUMBER(:POIDS_MVT,'99999999.9999')",
NUM_COMPTE char(16),
CODE_ANA char(25),
LIBELLE_MVT char(70),
QTE_ANNULATION "TO_NUMBER(:QTE_ANNULATION,'99999999.9999')",
VAL_ANNULATION "TO_NUMBER(:VAL_ANNULATION ,'999999999.99999999')",
ANNULATION_TOTAL ,
TYPE_DOC_ANNULATION char(5),
TITRE_DOC_ANNUL char(30),
NUM_DOC_ANNUL char(15),
NUM_LIGNE_REF_ANNULATION ,
DATE_DOC_ANNULATION Date "yyyy/mm/dd",
CODE_UTILISAT char(15),
CLE_DI char(25),
CLE_DF char(25),
CLE_DC char(25),
PVU "TO_NUMBER(:PVU ,'99999.99999')",
PAU "TO_NUMBER(:PAU ,'99999.99999')",
POIDS_ANNULATION "TO_NUMBER(:POIDS_ANNULATION ,'999999999.99999999')",
CLE_DEPOT,
f1 FILLER,
CLE_LIGNE_DOC_REF
)
je l'appel avec la commmade: sqlldr userid=User/User control=controlMOUV.txt data='C:\Users\AKB\Desktop\export mouv\%%A' log=log%%A bad=bad%%A discard=disard%%A direct=y errors=0 parallel=TRUE
je précise que le %%A est relative a un boucle for dans le fichier batch pour générer des noms de fichier dans le sqlldr.
Merci d'avance pour vos aides précieuses. je ne suis qu'un novice en sql*loader
8 réponses
Bonjour,
Il faut que tu supprimes l'index sur la table avant le sqloader puis que tu le recrées après.
Ou : http://www.dba-oracle.com/t_skip_index_maintenance_sqlldr.htm , mais à la fin de cette opération l'index est dans un status inutilisable donc peu d'interet puisqu'il faut le rebatir après.
cdlt
Un étranger, c'est un ami qu'on n'a pas encore rencontré.
Il faut que tu supprimes l'index sur la table avant le sqloader puis que tu le recrées après.
Ou : http://www.dba-oracle.com/t_skip_index_maintenance_sqlldr.htm , mais à la fin de cette opération l'index est dans un status inutilisable donc peu d'interet puisqu'il faut le rebatir après.
cdlt
Un étranger, c'est un ami qu'on n'a pas encore rencontré.
Bonjour Jee pee,Metci de votre.
Avec la suppression et la recréations des indexes que se trouve toute la difficulté car les mises a jour se font régulièrement dans la journée avec une automatisation(a travers un fichier batch que je lance avec le planificateur de tache windows). Donc vous voyez que solution n'est pas adapté.
Serait-il possible d'adopter une autre solution. merci
Avec la suppression et la recréations des indexes que se trouve toute la difficulté car les mises a jour se font régulièrement dans la journée avec une automatisation(a travers un fichier batch que je lance avec le planificateur de tache windows). Donc vous voyez que solution n'est pas adapté.
Serait-il possible d'adopter une autre solution. merci
Rebonjour jee pee,
Cette table je la crée dans ma base de donnée comme une table réel?
Ensuite l'insertion avec le sql: insert into MOUVEMENT select * from MOUVEMENT_TEMP; se fait manuellement dans la BD ou y'a-t-il un moyen pour q'il se fasse sans mon intervention car ses données doivent être insérer régulièrement dans la journée.
Cette table je la crée dans ma base de donnée comme une table réel?
Ensuite l'insertion avec le sql: insert into MOUVEMENT select * from MOUVEMENT_TEMP; se fait manuellement dans la BD ou y'a-t-il un moyen pour q'il se fasse sans mon intervention car ses données doivent être insérer régulièrement dans la journée.
si je comprend bien j'ajoute la ligne sqlplus system/manager@ORACLE_SID @recopie.sql au fichier de control?
exemple avec mon cas
LOAD DATA
APPEND
INTO TABLE MOUVEMENT
FIELDS TERMINATED BY '\t'
TRAILING NULLCOLS
(CODE_ETABL char(10),
CODE_DEPOT char(35),
CODE_PRODUIT char(35),
........
..........
)
sqlplus system/manager@ORACLE_SID @recopie.sql
dans le cas contraire comment se fait la syntaxe c'est à dire où je doit la placer. merci
exemple avec mon cas
LOAD DATA
APPEND
INTO TABLE MOUVEMENT
FIELDS TERMINATED BY '\t'
TRAILING NULLCOLS
(CODE_ETABL char(10),
CODE_DEPOT char(35),
CODE_PRODUIT char(35),
........
..........
)
sqlplus system/manager@ORACLE_SID @recopie.sql
dans le cas contraire comment se fait la syntaxe c'est à dire où je doit la placer. merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonsoir,jee pee j'ai avancé un peu je pense que la ligne sqlplus system/manager@ORACLE_SID @recopie.sql doit être dans la commande c'est à dire dans mon fichier bat de sorte qu'il soit lancer dans l'invite de commande comme le sqlldr cependant où doit se trouver le fichier recopie.sql?
Merci
Merci