Bonjour à tous,
J'ai encore une fois besoin de vos lumières
Je travaille actuellement sur un projet où on utilise odi comme ETL.
Mais j'ai un souci avec un fichier plat en source.
Ce fichier doit alimenter une dizaine de tables.La première colonne du fichier plat permet de savoir quelle table on va alimenter.
Ne voulant pas passer par une dizaine d'interface pour traiter un fichier source, on a décidé de passer par sqlloader (je ne connaissais pas).
J'ai récupéré le code que génère odi (pour le module de connaissance sqlloader) et j'ai essayé de le modifier dans un traitement.
ci dessous le code du fichier de controle :
Voici le callsqldr que j'ai récupéré (du jython)sous odi (via le module de connaissance) et que j'ai essayé d'adapté
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 SnpsOutFile "-File=/local/fichier_source.ctl" "-CHARSET_ENCODING=ISO8859-1" OPTIONS ( SKIP=0, ERRORS=9999999999, DIRECT=FALSE ) LOAD DATA INFILE "/local/fichier_source.txt" "STR x'0A'" BADFILE "/local/fichier_source.bad" DISCARDFILE "/local/fichier_source.dsc" DISCARDMAX 1 INTO TABLE BASE.Table_01 when (to_number(C1 = 1)) FIELDS TERMINATED BY X'7C' TRAILING NULLCOLS ( C1 FILLER , Num_client, Nom, Prenom, DATN)
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 import java.lang.String import java.lang.Runtime as Runtime from jarray import array import java.io.File import os import re import javaos def reportnbrows(): f = open(r"/local/fichier_source.log", 'r') try: for line in f.readlines(): if line.find("MAXIMUM ERROR COUNT EXCEEDED")>=0 : raise line finally: f.close() ctlfile = r"""/local/fichier_source.ctl""" logfile = r"""/local/fichier_source.log""" outfile = r"""/local/fichier_source.out""" oracle_sid='' if len('BASE/REFDEV00')>0: oracle_sid = '@'+'BASE/REFDEV00' loadcmd = r"""sqlldr ODI/<@=snpRef.getInfo("DEST_PASS") @>%s control="%s" log="%s" > "%s" """ % (oracle_sid,ctlfile, logfile, outfile) rc = os.system(loadcmd) if rc <> 0 and rc <> 2: raise "Load Error", "See %s for details" % logfile if rc==2: reportnbrows()
J'ai exécuté le traitement la première étape de génération du fichier de controle fonctionne bien (il est généré dans le répertoire).
Par contre l'étape callsqlldr tombe en échec.
Ci dessous le message d'erreur
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 java.lang.Exception: The application script threw an exception: java.lang.NullPointerException BSF info: Call sqlldr tables TEST_table1 at line: 0 column: columnNo at com.sunopsis.dwg.codeinterpretor.SnpCodeInterpretor.transform(SnpCodeInterpretor.java:635) at com.sunopsis.dwg.dbobj.SnpSessTaskSql.codeInterpretation(SnpSessTaskSql.java:419) at com.sunopsis.dwg.dbobj.SnpSessTaskSql.execScriptingOrders(SnpSessTaskSql.java:1615) at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTaskTrt(SnpSessTaskSql.java:2755) at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTask(SnpSessTaskSql.java:2515) at com.sunopsis.dwg.dbobj.SnpSessStep.treatAttachedTasks(SnpSessStep.java:537) at com.sunopsis.dwg.dbobj.SnpSessStep.treatSessStep(SnpSessStep.java:449) at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java:1954) at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor$2.doAction(StartSessRequestProcessor.java:326) at oracle.odi.core.persistence.dwgobject.DwgObjectTemplate.execute(DwgObjectTemplate.java:224) at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor.doProcessStartSessTask(StartSessRequestProcessor.java:246) at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor.access$0(StartSessRequestProcessor.java:237) at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor$StartSessTask.doExecute(StartSessRequestProcessor.java:794) at oracle.odi.runtime.agent.processor.task.AgentTask.execute(AgentTask.java:114) at oracle.odi.runtime.agent.support.DefaultAgentTaskExecutor$2.run(DefaultAgentTaskExecutor.java:83) at java.lang.Thread.run(Thread.java:619) Caused by: org.apache.bsf.BSFException: The application script threw an exception: java.lang.NullPointerException BSF info: Call sqlldr tables TEST_table1 at line: 0 column: columnNo at bsh.util.BeanShellBSFEngine.eval(Unknown Source) at bsh.util.BeanShellBSFEngine.exec(Unknown Source) at com.sunopsis.dwg.codeinterpretor.SnpCodeInterpretor.transform(SnpCodeInterpretor.java:621) ... 15 more
Je n'y comprends plus rien.
Merci d'avance pour votre aide.![]()
Partager