El siguiente script de evento muestra cómo realizar una llamada a la base de datos para borrar datos de la tabla de destino y, a continuación, utilizar sqlldr para rellenar la tabla de destino con un conjunto de datos extraído de EPM. En este ejemplo se muestra cómo rellenar una base de datos en la nube con sqlldr, pero se puede utilizar la misma técnica para rellenar otras bases de datos que no sean de Oracle de terceros. Al igual que en el ejemplo anterior, este script se proporciona como ejemplo y no está garantizado frente a defectos, y los usuarios no podrán registrar ninguna solicitud de servicio en los Servicios de Soporte de Oracle relativa a preguntas o incidencias relacionadas con el script.
El proceso de reescritura predeterminado utiliza sentencias de inserción individuales para publicar datos en la base de datos de destino, y si el conjunto de datos de reescritura es grande, se recomienda utilizar la utilidad de base de datos específica para cargar datos en bloque en lugar de utilizar el proceso predeterminado. En este ejemplo, el script muestra cómo llamar a la utilidad sqlldr de Oracle, y se asume que la utilidad se ha descargado de OTN y que está instalada y accesible para el script de evento.
#------------------------------------------------------------------------------------------#
# befExport.py
# This script is used to perform database operations as part of the writeback process
# The script also uses sqlldr, and this must be installed prior to executing the script
# References to sqlldr and the control file will be different from this script and should
# be updated to reference the location where sqlldr is installed in your environment.
#-----------------------------------------#
# Housekeeping and startup #
#-----------------------------------------#
from java.sql import DriverManager, SQLException
import subprocess
def main():
#---------------------------------------------------#
# Print integration context details to the log file #
#---------------------------------------------------#
agentAPI.logInfo("#---------------------------------#")
agentAPI.logInfo("# Delete data in table MC_WB_TEST ")
agentAPI.logInfo("# Location: " + agentContext["LOCATION"])
agentAPI.logInfo("# Integration: " + agentContext["INTEGRATION"])
agentAPI.logInfo("# Data File: " + agentContext["WRITEBACK_DATA_FILE"])
agentAPI.logInfo("#---------------------------------#")
#---------------------------------------#
# Retrieve user, password, and JDBC URL #
#---------------------------------------#
cred = agentAPI.getConnectionDetails()
url = cred.getJDBCUrl()
user = cred.getUserName()
password = cred.getPassword()
agentAPI.logInfo("# Connection Details")
agentAPI.logInfo("# URL: " + url)
agentAPI.logInfo("# User: " + user)
#---------------------------------------------------------------------------#
# Open connection to the database and execute SQL #
# This step deletes existing data before loading new data #
# For large tables it is recommended to truncate and the recreate the table #
#---------------------------------------------------------------------------#
cnx = DriverManager.getConnection(url, user, password)
agentAPI.logInfo("# Successfully connected to Oracle Cloud DB using DriverManager")
stmt = cnx.createStatement()
stmt.executeQuery('Delete from MC_WB_TEST')
agentAPI.logInfo("# Deleted all rows from MC_WB_TEST #")
agentAPI.logInfo("#----------------------------------#")
#-------------------------------------------------#
# Define the SQL*Loader command and its arguments #
#-------------------------------------------------#
agentAPI.logInfo("# Starting SQLLDR")
#----------------------------------------#
# Replace \ with \\ in the filename path #
#----------------------------------------#
data_file = agentContext["WRITEBACK_DATA_FILE"]
new_file = data_file.replace("\\", "\\\\")
#---------------------------------------------#
# Specify control file and include \\ in path #
#---------------------------------------------#
ctr_file = "C:\\EPMAgent\\bin\\MyData\\scripts\\instantclient\\load.ctl"
#--------------------------------------------------------#
# Specify user, password and tnsnames.ora entry #
# The format is user/password@<SID from tnsnames.ora> #
# for cloud databases. #
#--------------------------------------------------------#
user = user + "/" + password + "@mcebs19c_medium"
#------------------------#
# Specify path to sqlldr #
#------------------------#
sqlldr_path = "C:\\EPMAgent\\bin\\MyData\\scripts\\instantclient\\sqlldr"
#----------------------#
# Build sqlldr command #
#----------------------#
sqlldr_command = [
sqlldr_path,
"userid=" + user,
"control=" + ctr_file,
"data=" + new_file
]
#----------------------------#
# Run the SQL*Loader command #
#----------------------------#
with open("sqlldr_output.txt", "w") as fout:
exit_code = subprocess.call(sqlldr_command, stdout=fout, shell=True)
agentAPI.logInfo("# exit code: " + str(exit_code))
agentAPI.logInfo("#---------------------------------#")
#-------------------------------------------------------------#
# Skip additional agent sql processing #
# This ensures that the default insert processing is bypassed #
#-------------------------------------------------------------#
agentAPI.skipAction('true')
#----------------------------------------------#
# Raise an error if needed as part of #
# the process. This will halt the processing #
# of the write-back process #
#----------------------------------------------#
#agentAPI.logInfo("# Manually raising a ValueError to stop the process")
#raise ValueError("This is a manually raised ValueError")
return
#------------------------------------------------------------#
# Check for location and process if needed #
# The same script is used for data load and write-back, #
# so make sure that each specific case is correctly captured #
#------------------------------------------------------------#
#
if agentContext["LOCATION"] == "1WB_TEST":
main()
else:
agentAPI.logInfo("#--------------------------------------#")
agentAPI.logInfo("# Location: " + str(agentContext["LOCATION"]))
agentAPI.logInfo("# Script not required, exiting now...")
agentAPI.logInfo("#--------------------------------------#")