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 :
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)
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
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.