groovy - ODI 12c Groovy - 自动生成具有两个物理层的映射场景
问题描述
我想创建一个 groovy 脚本,它将生成具有两个物理层的映射的两个场景。
我有下面的代码,但似乎不正确。我尝试将物理层作为“generateSecnario”方法的值传递。不知道好不好。
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 方法中用“pd”更改“ms_i”(为每个物理层而不是每个映射生成场景),我会遇到这个错误:
嗨,我忘了提到我已经用 pd 替换并尝试过。当我第一次运行它时,我收到了这个错误:
类没有这样的属性:newScen:Generate_scenarios_v1(从错误行号中减去 18 以说明标准导入)groovy.lang.MissingPropertyException:没有这样的属性:类的newScen:org.codehaus.groovy.runtime.ScriptBytecodeAdapter 的Generate_scenarios_v1。在org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307) 的org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:52) 解包(ScriptBytecodeAdapter.java:53)在 Generate_scenarios_v1.run(Generate_scenarios_v1.groovy:80) 在 groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:263) 在 groovy.lang.GroovyShell.run(GroovyShell.java:518) 在 groovy.lang.GroovyShell.run( GroovyShell.java:497) 在 groovy.lang.GroovyShell。在 oracle.di.studio.groovy.GroovyScriptRunInstance.run(GroovyScriptRunInstance.java:222) 运行(GroovyShell.java:170)
在此之后,我会尝试再次运行它,它进入循环或类似的东西..它什么也不做,就像它被什么东西阻塞了一样。也许我需要关闭一些连接,但我不这样做......
解决方案
您正在调用的generateScenario方法的第一个参数是IOdiScenarioSource类型。此接口的实现之一是MapPhysicalDesign,因此您可以传递它而不是映射。
OdiScenario newScen = gene.generateScenario(pd, scenName, "100");
我看到您对具有不同版本号的两个场景使用相同的名称。从长远来看,这可能会导致一些混乱,特别是因为执行场景的版本 -1 将采用最新版本(因此在您的情况下进行更正)。我建议使用 2 个不同的名称(例如scenName+'_DAILY'
和scenName+'_CORR'
)
推荐阅读
- python - 改进表格中的 Pytesseract 结果(表格 OCR)
- c++ - 附加到向量时如何避免调用 memcpy()
>? - javascript - Magento 2.4 - 快速结帐 - 送货地址错误
- azure-resource-manager - 如何在 ARM 模板的参数部分引用密钥库中的机密作为默认值
- opengl - 如何使OpenGL光定向?
- php - 如何在 PHP 8.0 中使用 ssh2?
- r - 使用 R 计算字符串中的单句点和双句点
- python - 如何以排序方式分组而不是在同一行上使用不同的列?
- angular - 是否可以避免嵌套订阅?
- javascript - 如何在谷歌脚本中获取和使用返回值