ODI 12c Groovy-自动生成具有两个物理层的映射场景

ODI 12c Groovy-自动生成具有两个物理层的映射场景,groovy,oracle-data-integrator,Groovy,Oracle Data Integrator,我想创建一个groovy脚本,它将生成两个具有两个物理层的映射场景 我有下面的代码,但似乎不正确。我尝试将其作为“GenerateScnario”方法的值传递给物理层。我不知道是否可以 import oracle.odi.domain.project.finder.IOdiProjectFinder; import oracle.odi.domain.model.finder.IOdiDataStoreFinder; import oracle.odi.domain.project.finde

我想创建一个groovy脚本,它将生成两个具有两个物理层的映射场景

我有下面的代码,但似乎不正确。我尝试将其作为“GenerateScnario”方法的值传递给物理层。我不知道是否可以


import oracle.odi.domain.project.finder.IOdiProjectFinder;
import oracle.odi.domain.model.finder.IOdiDataStoreFinder;
import oracle.odi.domain.project.finder.IOdiFolderFinder;
import oracle.odi.domain.mapping.finder.IMappingFinder;
import oracle.odi.domain.model.OdiDataStore;
import oracle.odi.domain.model.OdiModel;
import oracle.odi.domain.model.finder.IOdiModelFinder;
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition;
import oracle.odi.generation.support.OdiScenarioGeneratorImpl;
import oracle.odi.generation.IOdiScenarioGenerator;
import oracle.odi.domain.runtime.scenario.OdiScenario;
import oracle.odi.domain.mapping.Mapping;
import oracle.odi.domain.mapping.finder.IMappingFinder;
import oracle.odi.domain.runtime.scenario.finder.IOdiScenarioFinder;
import oracle.odi.domain.project.OdiProject;



txnDef = new DefaultTransactionDefinition()
tm = odiInstance.getTransactionManager()
tme = odiInstance.getTransactionalEntityManager()
txnStatus = tm.getTransaction(txnDef)
def fm = ((IMappingFinder) tme.getFinder(Mapping.class)) // shorcut to Find Mapping
def mappingList = fm.findAll().findAll {w-> w.getProject().getCode() == 'DL_GENERATE_MAPPINGS'
}

if (mappingList == null) {
    println "Map is null"
}
ms = mappingList.iterator()
while (ms.hasNext()) {
    ms_i = ms.next()
    println ms_i.getName()
    scenName = ms_i.getName();

    stxnDef = new DefaultTransactionDefinition()
    stm = odiInstance.getTransactionManager()
    stme = odiInstance.getTransactionalEntityManager()
    stxnStatus = stm.getTransaction(stxnDef)

    OdiScenario sc = ((IOdiScenarioFinder) stme.getFinder(OdiScenario.class)).findLatestByName(scenName)
    if (sc != null) {
        println "Scenario already exist"
        println sc
    }
    println("test");
    odiInstance.getTransactionalEntityManager().persist(ms_i);
    PhysicalDesignList = ms_i.getExistingPhysicalDesigns();
    println("ceva" + PhysicalDesignList);
    for (pd in PhysicalDesignList) {
        if (pd.getName() == "DailyLayer") {
            println("test1");
            IOdiScenarioGenerator gene = new OdiScenarioGeneratorImpl(odiInstance);
            OdiScenario newScen = gene.generateScenario(ms_i, scenName, "100");
        } else if (pd.getName() == "CorrectionLayer") {
            println("test2");
            IOdiScenarioGenerator gene = new OdiScenarioGeneratorImpl(odiInstance);
            OdiScenario newScen = gene.generateScenario(ms_i, scenName, "200");
        }
    }

    println newScen
    //tme.persist(newScen)
    stm.commit(stxnStatus)
    println "Created"
    //odiInstance.close()
}
tm.commit(txnStatus)

你知道怎么做吗

谢谢,

更新1

如果我将generateScenario方法中的“ms_I”更改为“pd”(为每个物理层而不是每个映射生成场景),我会发现以下错误:

嗨,我忘了说我已经用pd替换了,并且试过了。当我第一次运行此命令时,出现以下错误:

没有这样的属性:类的newScen:Generate\u scenarios\u v1(减法 18从错误行号到标准导入的帐户) groovy.lang.MissingPropertyException:没有这样的属性:newScen for 类:生成场景 org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53) 在 org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:52) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307) 在Generate_scenarios_v1.run(Generate_scenarios_v1.groovy:80)处 groovy.lang.GroovyShell.RunScriptorManorteStorRunnable(GroovyShell.java:263) 在groovy.lang.GroovyShell.run(GroovyShell.java:518)的 在上运行(GroovyShell.java:497) 在上运行(GroovyShell.java:170) GroovyScriptRunInstance.run(GroovyScriptRunInstance.java:222)


在这之后,我将尝试再次运行它,它进入循环或类似的东西。。它什么都不做,就像被什么东西挡住了一样。也许我需要关闭一些连接,但我没有这样做…

您正在调用的方法的第一个参数是类型。该接口的一个实现是,因此您可以传递它,而不是映射

OdiScenario newScen = gene.generateScenario(pd, scenName, "100");

我看到您对两个场景使用相同的名称,但版本号不同。从长远来看,这可能会导致一些混乱,特别是因为执行场景的version-1将采用最新版本(因此在您的案例中进行更正)。我建议使用两个不同的名称(例如
scename+'''u DAILY'
scename+'''u CORR'

您调用的方法的第一个参数类型为。该接口的一个实现是,因此您可以传递它,而不是映射

OdiScenario newScen = gene.generateScenario(pd, scenName, "100");
我看到您对两个场景使用相同的名称,但版本号不同。从长远来看,这可能会导致一些混乱,特别是因为执行场景的version-1将采用最新版本(因此在您的案例中进行更正)。我建议使用两种不同的名称(例如
scename+''u DAILY'
scename+''u CORR'