(BUG)Kettle8.1.0.0-365轉換步驟輸出SQL檔案insert指令碼日期型別資料,格式不正確且沒有雙引號
阿新 • • 發佈:2019-03-03
使用Kettle的SQL輸出步驟輸出SQL指令碼時,出現SQL指令碼中的日期型別的資料格式不正確,且沒有使用單引號括起來。修改DataBase的GetSQLOutput方法解決了此問題,在此方法中增加了對日期資料的處理,具體見下面程式碼有中文註釋的哪一行。
package org.pentaho.di.core.database; /** * Database handles the process of connecting to, reading from, writing to and updating databases. The database specific * parameters are defined in DatabaseInfo. * * @author Matt * @since 05-04-2003 */ public class Database implements VariableSpace, LoggingObjectInterface { /** * Return SQL statement (INSERT INTO TableName ... * * @param schemaName tableName The schema * @param tableName * @param fields * @param dateFormat date format of field * @throws KettleDatabaseException */ public String getSQLOutput( String schemaName, String tableName, RowMetaInterface fields, Object[] r, String dateFormat ) throws KettleDatabaseException { StringBuilder ins = new StringBuilder( 128 ); try { String schemaTable = databaseMeta.getQuotedSchemaTableCombination( schemaName, tableName ); ins.append( "INSERT INTO " ).append( schemaTable ).append( '(' ); // now add the names in the row: for ( int i = 0; i < fields.size(); i++ ) { if ( i > 0 ) { ins.append( ", " ); } String name = fields.getValueMeta( i ).getName(); ins.append( databaseMeta.quoteField( name ) ); } ins.append( ") VALUES (" ); java.text.SimpleDateFormat[] fieldDateFormatters = new java.text.SimpleDateFormat[ fields.size() ]; // new add values ... for ( int i = 0; i < fields.size(); i++ ) { ValueMetaInterface valueMeta = fields.getValueMeta( i ); Object valueData = r[ i ]; if ( i > 0 ) { ins.append( "," ); } // Check for null values... // if ( valueMeta.isNull( valueData ) ) { ins.append( "null" ); } else { // Normal cases... // switch ( valueMeta.getType() ) { case ValueMetaInterface.TYPE_BOOLEAN: case ValueMetaInterface.TYPE_STRING: String string = valueMeta.getString( valueData ); // Have the database dialect do the quoting. // This also adds the single quotes around the string (thanks to // PostgreSQL) // string = databaseMeta.quoteSQLString( string ); ins.append( string ); break; case ValueMetaInterface.TYPE_DATE: case ValueMetaInterface.TYPE_TIMESTAMP: //增加此行,否則輸出的SQL指令碼中,不帶單引號 Date date = fields.getDate( r, i ); if ( Utils.isEmpty( dateFormat ) ) { if ( databaseMeta.getDatabaseInterface() instanceof OracleDatabaseMeta ) { if ( fieldDateFormatters[ i ] == null ) { fieldDateFormatters[ i ] = new java.text.SimpleDateFormat( "yyyy/MM/dd HH:mm:ss" ); } ins.append( "TO_DATE('" ).append( fieldDateFormatters[ i ].format( date ) ).append( "', 'YYYY/MM/DD HH24:MI:SS')" ); } else { ins.append( "'" + fields.getString( r, i ) + "'" ); } } else { try { java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat( dateFormat ); ins.append( "'" + formatter.format( fields.getDate( r, i ) ) + "'" ); } catch ( Exception e ) { throw new KettleDatabaseException( "Error : ", e ); } } break; default: ins.append( fields.getString( r, i ) ); break; } } } ins.append( ')' ); } catch ( Exception e ) { throw new KettleDatabaseException( e ); } return ins.toString(); } }