2015-09-25 24 views
4

這是我的第一個問題,我希望你能幫助我。我在Groovy中創建了一個腳本(在Oracle Data Integrator 12c中)來自動化映射。這裏是我的prodecure的描述: 1步:刪除舊的映射,如果存在。 2步:尋找項目和文件夾(如果它不存在:創建新的)。 3步:創建新的映射 4步:執行源和目標表 5步:創建表達 6步:連接每列自動製圖與表達

現在我的問題:誰能幫我做這個腳本動態表情?像這樣: 步驟1:獲得所述目標列的數據類型 步驟2:將適當的數據類型到表達 步驟3:改變假類型(總是的Varchar)進入右類型(數字或日期或靜止的Varchar ) 第4步:鏈接每一列

我的差點:我從來沒有用groovy和Java做過什麼,我不是很好。所以我不可能做到這一點。幾乎我的腳本中的所有內容都來自一些互聯網站點。找到一些知道我的問題的人會很高興。我認爲對於所有將從OWB變爲ODI的人來說,這將是一個很好的腳本。

謝謝!

//Von ODI Studio erstellt 
// 
//name of the project 
projectName = "SRC_TO_TRG" 
//name of the folder 
ordnerName = "FEN_TEST" 
//name of the mapping 
mappingName = "MAP1_FF_TO_TRG" 
//name of the model 
modelName = "DB_FEN" 
//name of the source datastore 
sourceDatastoreName = "SRC_TEST_FEN" 
//name of the target datastore 
targetDatastoreName = "TRG_TEST_FEN" 

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.project.finder.IOdiKMFinder 
import oracle.odi.domain.mapping.finder.IMappingFinder 
import oracle.odi.domain.adapter.project.IKnowledgeModule.ProcessingType 
import oracle.odi.domain.model.OdiDataStore 
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition 


//set expression to the component 
def createExp(comp, tgtTable, propertyName, expressionText) { 
    DatastoreComponent.findAttributeForColumn(comp,tgtTable.getColumn(propertyName)) .setExpressionText(expressionText) 
} 

//delete mapping with the same name 
def removeMapping(folder, map_name) { 
    txnDef = new DefaultTransactionDefinition() 
    tm = odiInstance.getTransactionManager() 
    tme = odiInstance.getTransactionalEntityManager() 
    txnStatus = tm.getTransaction(txnDef) 
    try { 
    Mapping map = ((IMappingFinder)  tme.getFinder(Mapping.class)).findByName(folder, map_name) 
    if (map != null) { 
     odiInstance.getTransactionalEntityManager().remove(map); 
    } 
    } catch (Exception e) {e.printStackTrace();} 
    tm.commit(txnStatus) 
} 

//looking for a project and folder 
def find_folder(project_code, folder_name) { 
    txnDef = new DefaultTransactionDefinition() 
    tm = odiInstance.getTransactionManager() 
    tme = odiInstance.getTransactionalEntityManager() 
    txnStatus = tm.getTransaction(txnDef) 
    pf = (IOdiProjectFinder)tme.getFinder(OdiProject.class) 
    ff = (IOdiFolderFinder)tme.getFinder(OdiFolder.class) 
    project = pf.findByCode(project_code) 

//if there is no project, create new one 
    if (project == null) { 
    project = new OdiProject(project_code, project_code) 
    tme.persist(project) 
    } 
//if there is no folder, create new one 
    folderColl = ff.findByName(folder_name, project_code) 
    OdiFolder folder = null 
    if (folderColl.size() == 1) 
    folder = folderColl.iterator().next() 
    if (folder == null) { 
    folder = new OdiFolder(project, folder_name) 
    tme.persist(folder) 
    } 
    tm.commit(txnStatus) 
    return folder 
} 

//name of the project and the folder 
    folder = find_folder(projectName,ordnerName) 
//delete old mapping 
    removeMapping(folder, mappingName) 

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

    dsf = (IOdiDataStoreFinder)tme.getFinder(OdiDataStore.class) 
    mapf = (IMappingFinder) tme.getFinder(Mapping.class) 

//create new mapping 
    map = new Mapping(mappingName, folder); 
    tme.persist(map) 

//insert source table 
    boundTo_emp = dsf.findByName(sourceDatastoreName, modelName) 
    comp_emp = new DatastoreComponent(map, boundTo_emp) 

//insert target table 
    boundTo_tgtemp = dsf.findByName(targetDatastoreName, modelName) 
    comp_tgtemp = new DatastoreComponent(map, boundTo_tgtemp) 

//create expression-operator 
    comp_expression = new ExpressionComponent(map, "EXPRESSION") 

// define expression 
    comp_expression.addExpression("LAND_KM",  "TO_NUMBER(SRC_TEST_FEN.LAND_KM)", null,null,null); 
    comp_expression.addExpression("DATE_OF_ELECTION",  "TO_DATE(SRC_TEST_FEN.DATE_OF_ELECTION, 'DD.MM.YYYY')", null,null,null); 
//weitere Transformationen anhängen möglich 

//link source table with expression 
    comp_emp.connectTo(comp_expression) 

//link expression with target table 
    comp_expression.connectTo(comp_tgtemp) 

    createExp(comp_tgtemp, boundTo_tgtemp, "ABBR", "SRC_TEST_FEN.ABBR") 
    createExp(comp_tgtemp, boundTo_tgtemp, "NAME", "SRC_TEST_FEN.NAME") 
    createExp(comp_tgtemp, boundTo_tgtemp, "LAND_KM", "EXPRESSION.LAND_KM") 
    createExp(comp_tgtemp, boundTo_tgtemp, "DATE_OF_ELECTION",  "EXPRESSION.DATE_OF_ELECTION") 

    tme.persist(map) 
    tm.commit(txnStatus) 

回答

2

您可以傳遞數據類型作爲方法addExpression的第三個參數。 您也可以將尺寸和比例作爲第四和第五個參數傳遞。

例如,對於LAND_KM表達,通過這個替換您的行:

MapAttribute map_attr = DatastoreComponent.findAttributeForColumn(comp_tgtemp,boundTo_tgtemp.getColumn("LAND_KM")) 
comp_expression.addExpression("LAND_KM", "TO_NUMBER(SRC_TEST_FEN.LAND_KM)", map_attr.getDataType(),map_attr.getSize(),map_attr.getScale()); 

據檢索LAND_KM感謝findAttributeForColumn目標列,然後檢索數據類型,大小和規模,並使用該在Expression組件中添加新表達式時。

如果你想它的基礎上的名字自動映射,戴維·艾倫寫道:關於如何做到這一點的Oracle官方博客的一篇文章,他提供了他的代碼:https://blogs.oracle.com/dataintegration/entry/odi_12c_mapping_sdk_auto

+0

謝謝你,但我要尋找一個腳本,在這裏你不必設置「LAND_KM」,因爲你從方法或其他東西獲得它。這是我的意思是動態的。唯一需要改變的是頂部的projectName,mappingName等。而PROGRAMM應該從目標表中得到數據類型的信息詳細信息,並改變他們...我希望你明白我的意思,我認爲這不是那麼簡單,是嗎? – GelliDucklbrein

+0

我編輯我的回答的最後一個鏈接添加到博客文章,解釋如何做到這一點。 – JeromeFr