O script de evento a seguir mostra como fazer uma chamada de banco de dados para limpar dados da tabela de destino e, em seguida, usar sqlldr para preencher a tabela de destino com um conjunto de dados extraído do EPM. Este exemplo mostra como preencher um banco de dados em nuvem com sqlldr, mas a mesma técnica pode ser usada para preencher outros bancos de dados não Oracle de terceiros. Como no exemplo anterior, este script é fornecido como um exemplo e não tem garantia contra falhas. Além disso, os usuários não podem registrar solicitações de serviço para o Suporte Técnico da Oracle com perguntas ou problemas relacionados ao script.
O processo de write-back padrão usa instruções de inserção individuais para lançar dados no banco de dados de destino. Se o conjunto de dados de write-back for grande, recomenda-se usar o utilitário de banco de dados específico para carregar dados em massa, em vez de usar o processo padrão. Neste exemplo, o script mostra como chamar o utilitário sqlldr da Oracle. Além disso, presume-se que o utilitário foi baixado do OTN e está instalado e acessível para o 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("#--------------------------------------#")