通过groovy脚本进行ODI选择性逆向工程

问题描述

我尝试将ODI-SDK与常规脚本一起使用,以自动进行选择性逆向工程数据存储以进行建模。为此,我使用了以下脚本doStandardReverse()方法,但出现错误。我正在尝试执行以下脚本。 我使用了以下文档中提到的API https://docs.oracle.com/middleware/12211/odi/reference-java-api/oracle/odi/core/service/reverse/ReverseService.html

import oracle.odi.domain.project.finder.IOdiProjectFinder
import oracle.odi.domain.model.finder.IOdiDataStoreFinder
import oracle.odi.domain.model.finder.IOdiModelfinder
import oracle.odi.domain.model.OdiModel
import oracle.odi.domain.model.OdiModelFolder
import oracle.odi.domain.model.OdiModel.ReverSEObjectType
import oracle.odi.domain.project.finder.IOdiFolderFinder
import oracle.odi.domain.project.finder.IOdiUserProcedureFinder
import oracle.odi.domain.project.finder.IOdiKMFinder
import oracle.odi.domain.mapping.finder.IMappingFinder
import oracle.odi.domain.adapter.project.IKNowledgeModule.ProcessingType
import oracle.odi.domain.topology.finder.IOdiContextFinder
import oracle.odi.domain.topology.finder.IOdiLogicalSchemaFinder
import oracle.odi.domain.topology.finder.IOdiTechnologyFinder
import oracle.odi.domain.topology.OdiContext
import oracle.odi.domain.topology.OdiTechnology
import oracle.odi.domain.topology.OdiLogicalSchema
import oracle.odi.domain.model.OdiDataStore
import oracle.odi.domain.xrefs.expression.Expression
import oracle.odi.domain.xrefs.expression.Expression.sqlGroupType
import oracle.odi.domain.project.OdiProcedureLine.LogCounter
import oracle.odi.domain.project.OdiProcedureLineCmd
import oracle.odi.domain.project.OdiUserProcedure
import oracle.odi.domain.project.OdiUserProcedureLine
import oracle.odi.domain.project.OdiPackage
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDeFinition
import oracle.odi.core.service.reverse.ReverseService
import oracle.odi.domain.project.StepModel.ReverseModel

txnDef = new DefaultTransactionDeFinition()
tm = odiInstance.getTransactionManager()
tme = odiInstance.getTransactionalEntityManager()
txnStatus = tm.getTransaction(txnDef)

def myList = ["SNP_CHECK_TAB","SRC_CITY"]


OdiModel srcModel = ((IOdiModelfinder)tme.getFinder(OdiModel.class)).findByCode("TEST_MOD");

//call reverse engeneering
rs = new ReverseService();

rm = rs.doStandardReverse(odiInstance,srcModel.getModelId(),ReverseService.DataStoreSelection.SELECTED,myList);

println('Data Store/s created.');


tm.commit(txnStatus)

我在下面遇到错误

java.lang.String cannot be cast to oracle.odi.core.service.reverse.OdiDataStoreNameAndType
(Subtract 18 from the error line number to account for the standard imports)
java.lang.classCastException: java.lang.String cannot be cast to oracle.odi.core.service.reverse.OdiDataStoreNameAndType
    at oracle.odi.core.service.reverse.ReverseService.convertDataStoreListToSnpsstringPair(ReverseService.java:452)
    at oracle.odi.core.service.reverse.ReverseService.doStandardReverse(ReverseService.java:169)
    at oracle.odi.core.service.reverse.ReverseService$doStandardReverse.call(UnkNown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:149)
    at di.run(di.groovy:61)
    at groovy.lang.groovyshell.runScriptOrMainorTestOrRunnable(groovyshell.java:263)
    at groovy.lang.groovyshell.run(groovyshell.java:518)
    at groovy.lang.groovyshell.run(groovyshell.java:497)
    at groovy.lang.groovyshell.run(groovyshell.java:170)
    at oracle.di.studio.groovy.GroovyScriptRunInstance.run(GroovyScriptRunInstance.java:222)
Script exited. 

解决方法

您的列表包含应该包含OdiDataStore对象的字符串。

接口IOdiDataStoreFinder

findByName方法可用于查找特定的OdiDataStore对象。