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