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.