mercoledì 15 luglio 2015

ODI 12c - Groovy Creare un mapping



A seguito della fusione OWB/ODI molte dei metodi SDK utilizzati per la 11g sono stati deprecati nella 12c. Questo ha portato ad una semplificazione del codice per la creazione di mapping ma ad una maggiore rigidità procedurale in quanto, l’introduzione di operatori utilizzati da OWB rende la programmazione moltro più serializzata e rigida. 
Mentre prima il paradigma era n source ed 1 target adesso l’introduzione degli operatori di OWB ha reso la creazione dei mapping più articolata portando all'interno dei mapping anche più di un target.
Nello script, di esempio, si vede come si sia semplificata la scrittura del codice ma allo stesso tempo come le operazioni da effettuare si siano serializzate.

Esempio Groovy:

//
//
// Sample Mapping SDK Code for ODI 12.1.3
//
//

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;
//
// Helper / utility function
//   set the expression on the component
def createExp(comp, tgtTable, propertyName, expressionText) {   DatastoreComponent.findAttributeForColumn(comp,tgtTable.getColumn(propertyName)).setExpressionText(expressionText)
}


//
// Delete the mapping passed in
//
def removeMapping(folder, map_name) {
...
}

//
// Find a folder within a project
//  returns the folder from the function
def find_folder(project_code, folder_name) {
 ...
  return folder
}

def basic_mapping(prj,fold, myMap) {
  

  folder = find_folder(prj,fold)
  removeMapping(folder, myMap)



  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)

  map = new Mapping(myMap, folder)
  tme.persist(map)

  // find del OdiStore source
  boundTo_emp = dsf.findByName("COUNTRIES", "HR")
  comp_emp = new DatastoreComponent(map, boundTo_emp)


  // find del OdiStore target
  boundTo_tgtemp = dsf.findByName("TGT_COUNTRIES", "HR")
  comp_tgtemp = new DatastoreComponent(map, boundTo_tgtemp)
 

  //connessione source target
  comp_emp.connectTo(comp_tgtemp)

  createExp(comp_tgtemp, boundTo_tgtemp, "COUNTRY_ID", "
COUNTRIES.COUNTRY_ID")
  createExp(comp_tgtemp, boundTo_tgtemp, "
COUNTRY_NAME", "COUNTRIES.COUNTRY_NAME")
  ...



  // inserire qui eventuali KM da utilizzare

  ...

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


m1 = basic_mapping("IF_TEMPLATE_1_GROOVY", "First Folder", "Basic_Mapping")



Quello che si ottiene è il seguente mapping:




Per maggiori informazioni si possono consultare anche i seguenti link:



https://blogs.oracle.com/dataintegration/entry/odi_12c_mapping_sdk_the
https://blogs.oracle.com/dataintegration/entry/odi_12c_mapping_builder
https://blogs.oracle.com/dataintegration/resource/odi12c_sdk/OdiMappingBuilder.java
https://blogs.oracle.com/warehousebuilder/entry/odi_11g_interface_builder
http://www.rittmanmead.com/2014/01/rittman-mead-and-oracle-data-integrator-12c-thoughts-and-experiences-so-far/
http://www.rittmanmead.com/2013/10/oracle-data-integrator-12c-release-part-1
http://www.rittmanmead.com/2013/11/oracle-data-integrator-12c-release-part-2/
http://www.ateam-oracle.com/getting-groovy-with-odi-upgrades-and-owb-migrations/

 

RDBMS ORACLE- Come estrarre il nome di una partizione generata automaticamente

Nel caso in cui si partiziona o sottopartiziona una tabella e non si fornisce in input il nome, Oracle lo genera in maniera automatica come SYS_P<xxxx>, a questo punto se si volesse conoscere il nome della partizione, conoscendo solo il valore di partizionamento, occorre andare in join per il campo HIGH_VALUE ed estrarsi il nome della partizione.
Sembra tutto semplice, peccato che il campo HIGH_VALUE è un campo di tipo long il che lo rende un pò ostico in fase di interrogazione. Per ottenere quanto indicato sopra possiamo utilizzare una semplice query che sfrutta xml generator.
Vediamo un caso pratico:

  1. Tabella partizionata by LIST 

 

A questo punto vogliamo trovare il nome della partizione che corrisponde a HIGH_VALUE =222.
Per trovare il nome della partizione possiamo eseguire la seguente query:

   

Fatto abbiamo trovato la partizione interrogando un campo long.
Giocando sulla select interna possiamo trovare anche le sottopartizioni ecc.