From f5d6a486cf92a871122492ccd18765f0ea91e384 Mon Sep 17 00:00:00 2001 From: hcelebi Date: Fri, 31 Jul 2026 16:20:59 +0200 Subject: [PATCH] odi post fix --- .../direct-to-target-loading-sqlldr/LICENSE | 35 + .../km_lkm_file_to_oracle_sqlldr_plus.xml | 4590 +++++++++++++++++ 2 files changed, 4625 insertions(+) create mode 100644 oci-and-db/database/data-integration/shared-assets/direct-to-target-loading-sqlldr/LICENSE create mode 100644 oci-and-db/database/data-integration/shared-assets/direct-to-target-loading-sqlldr/files/km_lkm_file_to_oracle_sqlldr_plus.xml diff --git a/oci-and-db/database/data-integration/shared-assets/direct-to-target-loading-sqlldr/LICENSE b/oci-and-db/database/data-integration/shared-assets/direct-to-target-loading-sqlldr/LICENSE new file mode 100644 index 000000000..4e179622a --- /dev/null +++ b/oci-and-db/database/data-integration/shared-assets/direct-to-target-loading-sqlldr/LICENSE @@ -0,0 +1,35 @@ +Copyright (c) 2026 Oracle and/or its affiliates. + +The Universal Permissive License (UPL), Version 1.0 + +Subject to the condition set forth below, permission is hereby granted to any +person obtaining a copy of this software, associated documentation and/or data +(collectively the "Software"), free of charge and under any and all copyright +rights in the Software, and any and all patent rights owned or freely +licensable by each licensor hereunder covering either (i) the unmodified +Software as contributed to or provided by such licensor, or (ii) the Larger +Works (as defined below), to deal in both + +(a) the Software, and +(b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +one is included with the Software (each a "Larger Work" to which the Software +is contributed by such licensors), + +without restriction, including without limitation the rights to copy, create +derivative works of, display, perform, and distribute the Software and make, +use, sell, offer for sale, import, export, have made, and have sold the +Software and the Larger Work(s), and to sublicense the foregoing rights on +either these or other terms. + +This license is subject to the following condition: +The above copyright notice and either this complete permission notice or at +a minimum a reference to the UPL must be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/oci-and-db/database/data-integration/shared-assets/direct-to-target-loading-sqlldr/files/km_lkm_file_to_oracle_sqlldr_plus.xml b/oci-and-db/database/data-integration/shared-assets/direct-to-target-loading-sqlldr/files/km_lkm_file_to_oracle_sqlldr_plus.xml new file mode 100644 index 000000000..2cd6e6f01 --- /dev/null +++ b/oci-and-db/database/data-integration/shared-assets/direct-to-target-loading-sqlldr/files/km_lkm_file_to_oracle_sqlldr_plus.xml @@ -0,0 +1,4590 @@ + + + + + + null + null + null + null + null + null + + + + + null + null + null + null + null + null + + + + null + null + + null + null + + + + + + + + + + + + null + null + + + + + + null + + null + null + + null + null + null + null + null + null + null + + + + + + + null + null + null + + + + + 1996;96 + "MMMM(M)*" "MONTH" // Month, supported: MMMM => July + "MMM" "MON" // Month, supported: MMM => JUL + "M" "M" // Month, supported: MM;M => 07;7 + "W" "W" // Week in month + "w" "WW" // Week in year + "DDD" "DDD" // Day in year + "dd" "DD" // Day in month + "a" "AM" // Am/pm marker + "HH" "HH24" // Hour in day (0-23) + "KK" "HH12" // Hour in day (0-11) + "mm" "MI" // Minute in hour + "SSSSSS" "FF6" // Millisecond in second + "SSSSS" "FF5" // Millisecond in second + "SSSS" "FF4" // Millisecond in second + "SSS" "FF3" // Millisecond in second + "SS" "FF2" // Millisecond in second + "S" "FF1" // Millisecond in second + "ss" "SS" // Second in minute + "Z" "TZH:TZM" // Timezone, supported: Z => +02:00 + +BASIC CONFIGURATION + 1. Specify the logical format for NUMERIC and DATE columns, + if the format does not match client nls settings. + 2. Set NLS_DATE_LANGUAGE, if your dates contain language specific elements + such as month names and the client language does not match these. + Note: select * from nls_session_parameters returns nls settings of client. + 3. Set NLS_NUMERIC_CHARACTERS, if your file number format does not match the client NLS + settings. + +OPTIONS (Refer to Option descriptions for more information on each option) + - DELETE_TEMPORARY_OBJECTS: Delete temp objects after integration phase + - WORK_TABLE_OPTIONS: table options for work table + - LOA_DIRECT: Use direct path insert? + - LOA_PARALLEL: Use Automatic Parallel load? + - DEGREE_OF_PARALLELISM: Number of threads used for parallel loading + - LOA_DISCARDMAX: Max number of records to discard + - LOA_ERRORS: Max number of errors for SQL Loader + - COMPATIBLE: Installed Oracle Database Client major version + - VALIDATE: Validate use of KM and options + - NLS_DATE_LANGUAGE: Language of date/timestamp elements + - NLS_NUMERIC_CHARACTERS: Override client NLS_NUMERIC_CHARACTERS setting + - CHARSET_ENCODING: Character set of the input file + +LIMITATIONS + Only file technology data types NUMERIC, DATE (including TIMESTAMP) and CHAR are + supported. + For Timestamps with timezones TZ will be truncated. For loading TS with TZ, please specify + the source column as STRING and apply the appropriate String to TS with TZ transformation, + e.g. + TO_TIMESTAMP_TZ(ALIAS.COL, 'YYYY-MM-DD HH24:MI:SS TZH:TZM') + It may occur that SQL*LOADER returns a 0 code (OK) even if the data was not loaded. + Consult the log files for more information.]]> + + + null + + + + + + + + null + + + + + + + + + + null + + + + + + null + null + null + + + + + + + + null + + + + + + + + null + + null + + + + + + + + null + + + + + + + null + null + + + + + + + + + null + + + + + + + + + + null + + + + + + null + null + null + + + + + + + + + null + + null + + + + + + + null + null + + + + + + + null + null + + + + + + + + null + + + + + + + + null + + + + + + + + + + null + + + + + + null + null + null + + + + + + + + + null + + + + + + + + + + null + + + + + + null + null + null + + + + + + + + + null + + + + + + + + + + null + + + + + + null + null + null + + + + + + + + + null + + + + + + + + + + null + + + + + + null + null + null + + + + + + + + + null + + + + + + + + + + null + + + + + + null + null + null + + + + + + + + + null + + + + + + + + + + null + + + + + + null + null + null + + + + + + + + + null + + + + + + + + + + null + + + + + + null + null + null + + + + + + + + + null + + + + + + + + + + null + + + + + + null + null + null + + + + + + + + + null + + + + + + + + + null + null + + + + + + null + null + null + + + + + + + + + null + + + + + + + + + null + null + + + + + + null + null + null + + + + + + + + + null + + + + + + + + + + null + + + + + + null + null + null + + + + + + + + + null + + + + + + + + + null + null + + + + + + + null + + null + + + + + + + null + null + + + + + + + null + + null + + + + + + + null + null + + + + + + + null + + null + + + + + + + null + null + + + + + + + null + + null + + + + + + + null + null + + + + + + + null + + null + + + + + + + + null + + + + + + + null + null + + + + + + + + + null + null + + + + + + + + + null + + null + + + + + + + + null + + + + + + + null + null + + + + + + + + + null + null + + + + + + + + + + null + null + null + null + + null + null + + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + null + + + null + null + + + null + null + null + + + + + + +analyze table <%=odiRef.getObjectName("T"+odiRef.getTableName("COLL_SHORT_NAME"),"W")%> estimate statistics + +<% } else { %> + +BEGIN +DBMS_STATS.GATHER_TABLE_STATS ( + ownname => '<%=odiRef.getInfo("DEST_WORK_SCHEMA")%>', + tabname => '<%=odiRef.getObjectShortName("L", "T"+odiRef.getTableName("COLL_SHORT_NAME"),"W")%>', + + estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE +); +END; + +<% }; %> + + + +]]> + + + null + + + + + + + + + null + null + null + null + + null + null + + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + null + + + null + null + + + null + null + null + + + + + +( +<%=odiRef.getSrcColList("","[COL_NAME] [DEST_CRE_DT]","[COL_NAME] [DEST_CRE_DT]",",\n","")%> +) +<%=odiRef.getOption("WORK_TABLE_OPTIONS")%>]]> + + + + + null + null + null + null + + null + null + null + null + null + null + null + + null + null + + null + + + + + + null + + + + + null + null + null + null + null + null + + null + + + null + null + null + null + null + null + null + null + null + null + null + null + null + null + + + + + + + + + + null + null + + + null + null + null + + + + + + + + + + null + null + null + null + + null + null + + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + null + + + null + null + + + null + null + null + + + + + +( + <%=odiRef.getColList("", "[CX_COL_NAME]" , ",\n\t", "","")%> +) as +select <%=odiRef.getPop("DISTINCT_ROWS")%> + <%=odiRef.getColList("", "[EXPRESSION]\t[ALIAS_SEP] [CX_COL_NAME]", ",\n\t", "", "")%> +from <%=odiRef.getObjectName("T"+odiRef.getTableName("COLL_SHORT_NAME"),"W")%> <%=odiRef.getSrcTablesList("", "[POP_TAB_ALIAS]", "", "")%> +]]> + + + + + null + null + null + null + + null + null + + null + null + null + null + + + null + + null + + + + + + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + null + + + null + null + + + null + null + null + + + + + <%=odiRef.getColList("", "", "", "", "") +%>".equals("F") ) { + ?>throw new OdiKMException("ODIKM-STDKM-LKM-10000", "ODIKM-STDKM-LKM-10000: Mapping NOT allowed on source") +if (ODIKM_invalidMapping==1 && "D".equals("D") ) { + ?>throw new OdiKMException("ODIKM-STDKM-LKM-10001", "ODIKM-STDKM-LKM-10001: For delimited files all source columns between the first in file and the last mapped, need to be mapped on staging! No gaps allowed")".equals( "26" ) && + !"<%=odiRef.getOption( "COMPATIBLE" )%>".equals( "21" ) && + !"<%=odiRef.getOption( "COMPATIBLE" )%>".equals( "19" ) && + !"<%=odiRef.getOption( "COMPATIBLE" )%>".equals( "12" ) && + !"<%=odiRef.getOption( "COMPATIBLE" )%>".equals( "11" ) && + !"<%=odiRef.getOption( "COMPATIBLE" )%>".equals( "10" ) && + !"<%=odiRef.getOption( "COMPATIBLE" )%>".equals( "9" ) && + !"<%=odiRef.getOption( "COMPATIBLE" )%>".equals( "8" )) { + ?>throw new OdiKMException("ODIKM-STDKM-10000", "ODIKM-STDKM-10000: Invalid value \"{0}\" for option \"COMPATIBLE\"",["<%=odiRef.getOption ("COMPATIBLE")%>"].toArray())".equals( "10" ) || "<%=odiRef.getOption( "COMPATIBLE" )%>".equals( "11" ) ) { + ODIKM_sPurge = "PURGE"; + +}; + +/* Use DBMS_STATS, if newer than v8 */ +String ODIKM_gatherStats = "ANALYZE"; +if (!"<%=odiRef.getOption( "COMPATIBLE" )%>".equals( "8" ) ) { + ODIKM_gatherStats = "DBMS_STATS"; +}; + +/* In case no errors were found, display message in log */ +if (ODIKM_errorsFound==0) { + out.print( "/* No errors detected*/" ); +}; + +?>]]> + + + + + null + null + null + null + + null + null + null + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + + + + null + null + + + null + null + null + + + + + .dsc", "FILE" )?>" -NOFILE_ERROR=no +]]> + + + + + null + null + null + null + + null + null + null + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + + + + null + null + + + null + null + null + + + + + .log", "FILE" )?>" -NOFILE_ERROR=no +]]> + + + + + null + null + null + null + + null + null + null + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + + + + null + null + + + null + null + null + + + + + .ctl", "FILE" )?>" -NOFILE_ERROR=no +]]> + + + + + null + null + null + null + + null + null + null + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + + + + null + null + + + null + null + null + + + + + .bad", "FILE" )?>" -NOFILE_ERROR=no]]> + + + + + null + null + null + null + + null + null + + null + null + null + null + + null + null + + null + + + + + + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + null + + + null + null + + + null + null + null + + + + + 1996;96 + {"MMMM(M)*", "month"}, // Month, supported: MMMM => July + {"MMM", "mon"}, // Month, supported: MMM => JUL + {"M", "M"}, // Month, supported: MM;M => 07;7 + {"month", "MONTH"}, // (auxiliary) + {"mon", "MON"}, // (auxiliary) + {"W", "W"}, // Week in month + {"w", "WW"}, // Week in year + {"DDD", "DDD"}, // Day in year + {"dd", "DD"}, // Day in month + {"a", "AM"}, // Am/pm marker + {"HH", "HH24"}, // Hour in day (0-23) + {"KK", "HH12"}, // Hour in day (0-11) + {"mm", "MI"}, // Minute in hour + {"SSSSSS", "FF6"}, // Millisecond in second + {"SSSSS", "FF5"}, // Millisecond in second + {"SSSS", "FF4"}, // Millisecond in second + {"SSS", "FF3"}, // Millisecond in second + {"SS", "FF2"}, // Millisecond in second + {"S", "FF1"}, // Millisecond in second + {"ss", "SS"}, // Second in minute + {"Z", "TZH:TZM"} // Timezone, supported: Z => +02:00 + }; + + public static String translate( String srcDT, String colFormat ) throws Exception { + String format = ""; + + if (colFormat.trim().length()==0) + /* we use Oracle's default format */ + format = ""; + else { + // Is source column a date? + if ( srcDT.toUpperCase().equals( "DATE") ) { + format = colFormat; + for (int i = 0; i < transTableDate.length; i++) + format = format.replaceAll( transTableDate[i][0], transTableDate[i][1] ); + } else + // Is source column a numeric? + if ( srcDT.toUpperCase().equals( "NUMERIC")) { + format = ""; + } else + // Is source column anything else than a string? + if ( !srcDT.toUpperCase().equals( "STRING" )) + throw new OdiKMException("ODIKM-FILE-10007", "ODIKM-FILE-10007: No format translation defined for data type {0}", new Object[] {srcDT} ); + }; + if ( format.length() > 0 ) + format = format; + return format; + } + +} + +public class sqlldrColFormat { + public static String nlsDateLanguage = "<%= (odiRef.getOption("NLS_DATE_LANGUAGE").length()==0)?"":"NLS_DATE_LANGUAGE=''"+odiRef.getOption("NLS_DATE_LANGUAGE")+"''"%>"; + public static boolean enforceNlsNumChars = <%=(odiRef.getOption("NLS_NUMERIC_CHARACTERS").length()>0)?"true":"false"%>; + public static String nlsNumChars = "NLS_NUMERIC_CHARACTERS=''<%=odiRef.getOption("NLS_NUMERIC_CHARACTERS")%>''"; + + + public static String get( String colName, srcDataType, destDataType, colFormat, colPrecision, colScale, colBytes ) { + String format = ""; + String oracleDataFormat = FormatTranslator.translate( srcDataType, colFormat ); + + // Is the source column a DATE? + if ("DATE".equals(srcDataType)) { + dataType = ""; + dataConvFunc = ""; + // How many digits are there for milliseconds? + int precision = colFormat.replaceAll("[^S]","").length(); + // Does the source column contain a timezone? + if (colFormat.indexOf("Z")>-1) { + if (precision > 0) { + dataType = "TIMESTAMP(" + precision.toString() + ") WITH TIME ZONE"; + } else { + dataType = "TIMESTAMP WITH TIME ZONE"; + }; + dataConvFunc = "TO_TIMESTAMP_TZ"; + // Does the source column contain milliseconds? + } else if (precision > 0) { + dataType = "TIMESTAMP(" + precision.toString() + ")"; + dataConvFunc = "TO_TIMESTAMP"; + } else { + dataType = "DATE"; + dataConvFunc = "TO_DATE"; + }; + // Does the source column contain a language specifc element and has a date language been specified? + if ((colFormat.indexOf("MMM")>-1 || + colFormat.indexOf("a")>-1) && + nlsDateLanguage.length()>0) { + // Explicit conversion function required + format = " "+(char)34+dataConvFunc+"(:"+colName+", '"+oracleDataFormat+"', '"+nlsDateLanguage+"')"+(char)34; + } else { + // Is there a column format defined for this column? + if (colFormat.length()>0) { + // Implicit conversion by date_format clause + format = " "+dataType+" "+(char)34+oracleDataFormat+(char)34; + } else { + // Use client nls settings to convert date/timestamp + format = ""; + }; + }; + } else + + // Is the source column a NUMERIC? + if ("NUMERIC".equals(srcDataType)) { + // Do we need to enforce NLS settings for numbers? + if (enforceNlsNumChars) { + if (colPrecision.length() == 0) + throw new OdiKMException("ODIKM-FILE-10011", "ODIKM-FILE-10011: Column {0}: Precision is not defined! Please correct precision", new Object[] {colName} ); + if (colScale.length() == 0) + throw new OdiKMException("ODIKM-FILE-10012", "ODIKM-FILE-10012: Column {0}: Scale is not defined! Please correct scale", new Object[] {colName} ); + precision = new Integer(colPrecision).intValue(); + scale = new Integer(colScale).intValue(); + // Build a number format according to precision and scale + digitsInFront = precision - ((scale==0)?0:(scale + 1)); + digitsBehind = scale; + if (digitsInFront < 0) + throw new OdiKMException("ODIKM-FILE-10010", "ODIKM-FILE-10010: Column {0}: Scale > Precision is not supported. Please correct precision/scale", new Object[] {colName} ); + format = " "+(char)34+"TO_NUMBER(:"+colName+", '"; + format += "99999999999999999999999999999999999999".substring(0,digitsInFront); + if (digitsBehind>0) { + format += "D"; + format += "99999999999999999999999999999999999999".substring(0,digitsBehind); + }; + format += "', '"+nlsNumChars+"')"+(char)34; + } else { + format = "DECIMAL EXTERNAL"; + }; + } else { + + // The source column is a STRING => add char(length) for length greater than 255 + if (colBytes.length() == 0) + throw new OdiKMException("ODIKM-FILE-10013", "ODIKM-FILE-10013: Column {0}: Physical length is not defined! Please correct length", new Object[] {colName} ); + taille = new Integer(colBytes).intValue(); + if (taille > 254) + format = "CHAR("+colBytes+")"; + else + format =""; + }; + + return format; + } +} + +public static String stringToHex(String base) + { + StringBuffer buffer = new StringBuffer(); + int intValue; + for(int x = 0; x < base.length(); x++) + { + + intValue = base.charAt(x); + buffer.append(Integer.toHexString(intValue)); + } + return buffer.toString(); +} + + + +?> + +OdiOutFile "-File=<%=odiRef.getSrcTablesList("[WORK_SCHEMA]/", "")%>.ctl", "FILE" )?>" "-CHARSET_ENCODING=<%= odiRef.getOption("CHARSET_ENCODING") %>" +OPTIONS ( + SKIP=<%=odiRef.getSrcTablesList("", "[FILE_FIRST_ROW]", "", "")%>, + ERRORS=<%=odiRef.getOption("LOA_ERRORS")%>, + DIRECT=<%=odiRef.getOption("LOA_DIRECT")%>, + PARALLEL=<%=odiRef.getOption("LOA_PARALLEL")%>, + <% + if (odiRef.getOption("OPTIMIZE_PARALLEL").equals("FALSE")){ + out.println("OPTIMIZE_PARALLEL=FALSE,"); + + } + else + out.println("OPTIMIZE_PARALLEL=TRUE,"); + + Integer deg_of_parallel; + try { + deg_of_parallel = Integer.parseInt(odiRef.getOption("DEGREE_OF_PARALLELISM")); + } + catch(NumberFormatException e){ + deg_of_parallel=2; + } + out.println(" DEGREE_OF_PARALLELISM="+deg_of_parallel); + %> + ) + +LOAD DATA +<% String charset=odiRef.getOption("DATA_CHARSET_ENCODING"); +if (charset!=null && charset.length()>0) out.print("CHARACTERSET " + charset); +%> +INFILE '<%=odiRef.getSrcTablesList("", "[SCHEMA]/[RES_NAME]", "", "")%>' "STR x'<%=odiRef.getSrcTablesList("[XFILE_SEP_ROW]","")%>'" +BADFILE '<%=odiRef.getSrcTablesList("[WORK_SCHEMA]/", "")%>.bad", "FILE" )?>' +DISCARDFILE '<%=odiRef.getSrcTablesList("[WORK_SCHEMA]/", "")%>.dsc", "FILE" )?>' +DISCARDMAX <%=odiRef.getOption("LOA_DISCARDMAX")%> +INTO TABLE ".equals("0")) {?><%=odiRef.getTargetTable("SCHEMA")%>.<%=odiRef.getTargetTable("RES_NAME")%><%=odiRef.getObjectName("T" + odiRef.getTableName("COLL_SHORT_NAME"), "W")%> +<% if (odiRef.getSrcTablesList("", "[FILE_FORMAT]", "", "").equals("F")) {%> +( + <%=odiRef.getSrcColList("", + "[COL_NAME]\tPOSITION([FILE_POS]:[FILE_END_POS])\t"+ "", + "[COL_NAME]\tPOSITION([FILE_POS]:[FILE_END_POS])\t"+ "", + ",\n\t", "")%> +) +<%} else { %> +FIELDS TERMINATED BY X'<%=odiRef.getSrcTablesList("", "[XFILE_SEP_FIELD]", "", "")%>' +<% String enclosedBy = odiRef.getSrcTablesList("", "[FILE_ENC_FIELD]", "", ""); +if (enclosedBy.length()>0) {%> + + + OPTIONALLY ENCLOSED BY + <% if (enclosedBy.length() == 2) {%> + '<%=enclosedBy.charAt(0)%>' AND '<%=enclosedBy.charAt(1)%>' + <%} else {%> + '<%=enclosedBy%>' + <%}%> + +<% } %> +TRAILING NULLCOLS +( + <%=odiRef.getSrcColList("", + "[COL_NAME]\t"+ "", + "[COL_NAME]\t"+ "", + ",\n\t", "")%> +) +<% } %>]]> + + + + + null + null + null + null + + null + null + + null + null + null + null + + null + null + + null + + + + + + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + null + + + null + null + + + null + null + null + + + + + .ctl", "FILE" )?>""" +logfile = r"""<%=odiRef.getSrcTablesList("[WORK_SCHEMA]/", "")%>.log", "FILE" )?>""" +outfile = r"""<%=odiRef.getSrcTablesList("[WORK_SCHEMA]/", "")%>.out", "FILE" )?>""" +oracle_sid='' +if len('<%=odiRef.getInfo("DEST_DSERV_NAME")%>')>0: + oracle_sid = '@'+'<%=odiRef.getInfo("DEST_DSERV_NAME")%>' + + +loadcmd = r"""sqlldr %s control=%s log=%s""" % (r"""<%=odiRef.getInfo("DEST_USER_NAME")%>""", ctlfile, logfile) +loadcmdtolog = r"""sqlldr %s/%s control=%s log=%s""" % (r"""<%=odiRef.getInfo("DEST_USER_NAME")%>""", r"""********""" + oracle_sid, ctlfile, logfile) + + +if os.path.exists(logfile) and not os.access(logfile, os.W_OK): + message = "ODIKM-STDKM-10012: Load Error: Insufficient privileges to write to the file {0} ".format(logfile) + raise Exception(message) + +#ldrpath = find_executable("sqlldr") +ldrpath = which("sqlldr") + +if ldrpath is None or ldrpath=="": + message = "ODIKM-STDKM-10012: Load Error: SQLLDR is not found. Please verify ORACLE_HOME and PATH variables" + raise Exception(message) +elif not os.access(ldrpath, os.X_OK): + message = "ODIKM-STDKM-10012: Load Error: SQLLDR cannot be executed, Insufficient privileges" + raise Exception(message) + +rc = 0 + +try: + outfileHandle = open( outfile, 'w' ) + p = subprocess.Popen(loadcmd, shell=True, stdin=subprocess.PIPE, stdout=outfileHandle.fileno(), stderr=outfileHandle.fileno() ) + p.communicate((r"""<%=odiRef.getInfo("DEST_PASS")%>""" + oracle_sid).encode()) + rc = p.returncode + outfileHandle.close() + +finally: + if outfileHandle != None: + outfileHandle.close() + +if rc != 0 and rc != 2: + message = "ODIKM-STDKM-10012: Load command \n {0} \n produced error. See {1} and {2} for details".format(loadcmdtolog,logfile,outfile) + raise Exception(message) + +# Init Vars +nbIns = 0 +nbRej = 0 +nbNull = 0 +strprt = "" +maxAllowedError = r"""<%=odiRef.getOption("LOA_ERRORS")%>""" +c = 0 +flag = 0 + +# Open log file +f = open(logfile, "r") +try: + lines = f.readlines() + for line in lines: + if line.find("ORA-01653")>-1 or line.find("SQL*Loader-605")>-1: + message = "ODIKM-STDKM-10012: Load Error: See {0} and {1} for details".format(logfile,outfile) + raise Exception(message) + if line.rstrip().upper().endswith(r"""<%=odiRef.getObjectName("T"+odiRef.getTableName("COLL_SHORT_NAME"),"W")%>:""".upper()): + flag = 1 + c = 0 + if flag == 1: + if c > 0 and c <= 4: + if c == 1 : + nbIns = int(re.findall("\d+", line)[0]) + elif c == 2: + nbRej = int(re.findall("\d+", line)[0]) + elif c == 4: + nbNull = int(re.findall("\d+", line)[0]) + break + c+=1 + strprt = "\n\tIns:\t%s\n\tReject:\t%s\n\tNullField:\t%s" % (nbIns, nbRej, nbNull) +finally: + f.close() + + +# if some rows has been rejected due to invalid data, check KM option LOA_ERRORS +if rc == 2: + if nbRej > int(maxAllowedError): + message = "ODIKM-STDKM-LKM-10003: Rejected records more than allowed" + strprt + raise Exception(message)]]> + + + + + null + null + null + null + + null + null + null + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + + + + null + null + + + null + null + null + + + + + .out", "FILE" )?>" -NOFILE_ERROR=no +]]> + + + + + null + null + null + null + + null + null + + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + null + + + null + null + + + null + null + null + + + + + +]]> + + + + + null + null + null + null + + null + null + + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + null + + + null + null + + + null + null + null + + + + + <% if (new Integer(odiRef.getOption( "COMPATIBLE" )).intValue() >= 10 ) { out.print( "purge" ); }; %>]]> + + + + + null + null + null + null + + null + null + + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + null + + + null + null + + + null + null + null + + + + + Index <%=odiRef.getObjectName(odiRef.getTemporaryIndex ("IDX_NAME")) %> on <%=odiRef.getObjectName("T"+odiRef.getTableName("COLL_SHORT_NAME"),"W")%> +<%=odiRef.getTemporaryIndexColList( "(", " [CX_COL_NAME] ", ", ", ")" )%> +]]> + + + + + null + null + null + null + + null + null + + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + + + + null + null + + + null + null + null + + + + + ]]> + + + + + null + null + null + null + + null + null + + null + null + null + null + + null + null + + null + + + + + null + null + + + + + + + + + + + + + + + + + + null + + + + + + + null + + + + + + + + null + + + + + null + null + + + null + null + null + + + + + <% if (new Integer(odiRef.getOption( "COMPATIBLE" )).intValue() >= 10 ) { out.print( "purge" ); }; %>]]> + + + + + null + null + null + null + + + null + null + null + null + null + null + + + null + + + + + + + + null + + + + + null + null + null + null + null + null + + null + + + null + null + null + null + null + null + null + null + null + null + null + null + null + null + + + + + + + + + + null + + + + + null + null + + + + + + + + + + null + null + null + null + + + null + null + null + null + null + null + + + null + + + + + + + + null + + + + + null + null + null + null + null + null + + null + + + null + null + null + null + null + null + null + null + null + null + null + null + null + null + + + + + + + + + + null + null + + + + null + null + + + + + + + + + + null + null + null + null + + + null + null + null + null + null + null + + + null + + + + + + + + null + + + + + null + null + null + null + null + null + + null + + + null + null + null + null + null + null + null + null + null + null + null + null + null + null + + + + + + + + + + null + "; + targetTableName = "<%=odiRef.getTargetTable(\"TABLE_NAME\")%>"; + ]]> + + + + null + null + + + + + + + + + + null + null + null + null + + + null + null + null + null + null + null + + + null + + + + + + + + null + + + + + null + null + null + null + null + null + + null + + + null + null + null + null + null + null + null + null + null + null + null + null + null + null + + + + + + + + + + null + "; + targetTableName = "<%=odiRef.getTargetTable(\"TABLE_NAME\")%>"; + ]]> + + + + null + null + + + + + + + + + + null + null + null + null + + + null + null + null + null + null + null + + + null + + + + + + + + null + + + + + null + null + null + null + null + null + + null + + + null + null + null + null + null + null + null + null + null + null + null + null + null + null + + + + + + + + + + null + "; + targetTableName = "<%=odiRef.getTargetTable(\"TABLE_NAME\")%>"; + tableName = "<%=odiRef.getTable(\"L\",\"TARG_NAME\", \"A\")%>"; + ]]> + + + + null + null + + + + + + + + + + null + null + null + null + + + null + null + null + null + null + null + + + null + + + + + + + + null + + + + + null + null + null + null + null + null + + null + + + null + null + null + null + null + null + null + null + null + null + null + null + null + null + + + + + + + + + + null + "; + targetTableName = "<%=odiRef.getTargetTable(\"TABLE_NAME\")%>"; + tableName = "<%=odiRef.getTable(\"L\", \"TARG_NAME\", \"A\")%>"; + ]]> + + + + null + null + + + + + + + + + + null + null + null + null + + + null + null + null + null + null + null + + + null + + + + + + + + null + + + + + null + null + null + null + null + null + + null + + + null + null + null + null + null + null + null + null + null + null + null + null + null + null + + + + + + + + + + null + null + + + + null + null + + + + + + + + + + null + null + null + null + + + null + null + null + null + null + null + + + null + + + + + + + + null + + + + + null + null + null + null + null + null + + null + + + null + null + null + null + null + null + null + null + null + null + null + null + null + null + + + + + + + + + + null + null + + + + null + null + + + + + + + + + + null + null + null + null + + + null + null + null + null + null + null + + + null + null + + + + + + + null + + + + + null + null + null + null + null + null + + null + + + null + null + null + null + null + null + null + null + null + null + null + null + null + null + + + + + + + + + + null + null + + + + null + null + + + + + */ into <%=odiRef.getTable("L","TARG_NAME","A")%> +( + <%=odiRef.getColList("", "[COL_NAME]", ",\n\t", "", "((INS and !TRG) and REW)")%> + <%=odiRef.getColList(",", "[COL_NAME]", ",\n\t", "", "((INS and TRG) and REW)")%> +) + +select + <%=odiRef.getColList("", "[COL_NAME]", ",\n\t", "", "((INS and !TRG) and REW)")%> + <%=odiRef.getColList(",", "[EXPRESSION]", ",\n\t", "", "((INS and TRG) and REW)")%> +FROM <%=odiRef.getObjectName("T" + odiRef.getTableName("COLL_SHORT_NAME"), "W")%> +where (1=1) +<%=odiRef.getJoin()%> +<%=odiRef.getFilter()%> +<%=odiRef.getGrpBy()%> +<%=odiRef.getHaving()%>]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + null + null + null + + + + + + + + + + + + null + null + null + + + + + null + null + null + + + + null + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + null + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + null + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + null + null + null + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +