"startscen"命令执行ODI Scenario 提示无法开始,因为"java.lang.IndexOutOfBoundsException: toIndex" Or "java.lang.NullPointerException"
Applies to:
Oracle Data Integrator - Version: 10.1.3.2
This problem can occur on any platform.
症状
通过ODI "startscen.bat(.sh)"命令启动Scenario,指令未启动同时下列信息抛出:
java.lang.IndexOutOfBoundsException: toIndex = 33683
at java.util.SubList.<init>
at java.util.RandomAccessSubList.<init>
at java.util.AbstractList.subList
at com.sunopsis.m.a.g.a
...
at oracle.odi.Agent.main
注意到,在"odiparams.bat(.sh)"配置文件中,ODI_SECU_ENCODED_PASS设置如下
set ODI_SECU_ENCODED_PASS="agent ENCODE myPassword"
原因
ODI的ODI_SECU_ENCODED_PASS and ODI_ENCODED_PASS变量应该为"agent encode"命令加密。结果字符串应该被设置在"odiparams.bat(.sh)"配置文件中这些字段。
解决方案:
1. 进入命令提示符,进ODI的"/bin"目录下,然后对密码进行加密。详见d in Note.423842.1 <How Can I Encrypt A Password?>.
2. 复制加密后的字符串,粘贴到ODI_SECU_ENCODED_PASS and/or ODI_ENCODED_PASS变量中("odiparams.bat(.sh)"配置文件中定义)
例如
set ODI_SECU_ENCODED_PASS=eofpBV0gXAbqoStGqXMZ8XAvRJll
...
set ODI_ENCODED_PASS=b9ypE6YhlBsKBS7nrLNqC5.Fp
3. 应用更改并重新执行该Scenario
只要ODI认加密算法,就会有错误产生,这取决于解析水平上已检测到的错误。
事实上,下面的消息可能会发生:
java.lang.IndexOutOfBoundsException: toIndex = 33683
at java.util.SubList.<init>(AbstractList.java:705)
at java.util.RandomAccessSubList.<init>(AbstractList.java:861)
at java.util.AbstractList.subList(AbstractList.java:570)
at com.sunopsis.m.a.g.a(g.java)
at com.sunopsis.m.a.c.a(c.java)
at com.sunopsis.m.a.f.b(f.java)
at com.sunopsis.tools.core.SnpsStringTools.b(SnpsStringTools.java)
at com.sunopsis.dwg.DwgObject.snpsDecypher(DwgObject.java)
at com.sunopsis.dwg.DwgJv.treatCmd(DwgJv.java)
at com.sunopsis.dwg.DwgJv.main(DwgJv.java)
at oracle.odi.Agent.main(Agent.java)
Terminate batch job (Y/N)? y
当密码没有被加密,同时以小写字母开头时。由于ODI版本原因有的加密算法并不能被ODI解密。当这种情况发生时,此Scenario 应当被冻结并手动杀死。
ava.lang.NullPointerException
at com.sunopsis.m.a.f.b(f.java)
at com.sunopsis.tools.core.SnpsStringTools.b(SnpsStringTools.java)
at com.sunopsis.dwg.DwgObject.snpsDecypher(DwgObject.java)
at com.sunopsis.dwg.DwgJv.treatCmd(DwgJv.java)
at com.sunopsis.dwg.DwgJv.main(DwgJv.java)
at oracle.odi.Agent.main(Agent.java)
Terminate batch job (Y/N)?
当密码只有一个单词组成,并且包括大小写。由于ODI版本原因有的加密算法并不能被ODI解密。当这种情况发生时,此Scenario 应当被冻结并手动杀死。
java.sql.SQLException: ORA-01017: invalid username/password; logon denied
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:283)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:278)
at oracle.jdbc.driver.T4CTTIoauthenticate.receiveOauth(T4CTTIoauthenticate.java:791)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:362)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:439)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
at com.sunopsis.sql.SnpsConnection.u(SnpsConnection.java)
at com.sunopsis.sql.SnpsConnection.c(SnpsConnection.java)
at com.sunopsis.sql.i.run(i.java)
当密码以大写字母开头。密码以大写字母开头,ODI认为是以前的Sunopsis加密方法已应用,并尝试解密。结果被传递到数据库,提出了一个无效的密码信息。在这种情况下,Excution在得到密码错误消息后恢复。
当执行OdiSqlUnload (SnpsSqlUnload) or other 使用加密密码的ODI工具时,同样的行为也会发生