Sql*loader Erreur de chargement avec l'option APPEND

Résolu/Fermé
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014 - 18 janv. 2013 à 11:47
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014 - 18 janv. 2013 à 18:16
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

8 réponses

jee pee Messages postés 40478 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 27 novembre 2024 9 428
Modifié par jee pee le 18/01/2013 à 13:22
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é.
0
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014
18 janv. 2013 à 12:59
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
0
jee pee Messages postés 40478 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 27 novembre 2024 9 428
18 janv. 2013 à 13:13
Tu charges dans une table intermédiaire, et après le sqloader tu lances un sql via sqlplus qui insère la table intermédiaire dans la table finale.
0
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014
18 janv. 2013 à 14:54
Bonjour,
ok mais comment se fait cette méthode ou s'il y'a des liens pour avoir de amples information
0
jee pee Messages postés 40478 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 27 novembre 2024 9 428
18 janv. 2013 à 14:59
C'est tout simple, tu crées une table MOUVEMENT_TEMP idem la table MOUVEMENT

Tu charges la table temporaire avec sqlloader et après tu fais un sql qui fait juste

insert into MOUVEMENT select * from MOUVEMENT_TEMP;
0
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014
18 janv. 2013 à 15:12
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.
0
jee pee Messages postés 40478 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 27 novembre 2024 9 428
18 janv. 2013 à 15:19
oui bien sur c'est une table dans la base de données.

tu lances le sql dans le fichier de commande qui lance le sqlloader

tu rajoutes quelque chose du style

sqlplus system/manager@ORACLE_SID    @recopie.sql

le recopie.sql contenant l'insert
0
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014
18 janv. 2013 à 15:27
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014
18 janv. 2013 à 16:19
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
0
jee pee Messages postés 40478 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 27 novembre 2024 9 428
18 janv. 2013 à 17:13
Oui c'est bien dans le fichier batch que tu lances avec le planificateur qu'il faut rajouter la ligne sqlplus

Ou mettre le .sql : soit il est dans le répertoire de travail de la tache qui exécute le batch, soit tu mets son nom complet style c:\monsql\expl\recopie.sql
0
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014
18 janv. 2013 à 17:19
ok merci beaucoup je vous tient au courant de la suite
0
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014
18 janv. 2013 à 18:16
Merci jee pee ça fonctionne
je perd en efficacité car le temps d'insertion dans la table MOUVEMENT prend du temps mais je suis vraiment ravi d'avoir pu insérer les données. Merci encore
0