pentaho/pentaho-kettle · error · KettleStepException

Unable to find field [] in the input rows

Error message

Unable to find field [] in the input rows

What it means

Thrown by OraBulkLoaderMeta.getFields() when building the output row layout for the Oracle bulk load. For each mapped field, the step looks up the incoming stream field name via RowMetaInterface.searchValueMeta; if a configured stream field name does not exist in the previous step's row metadata, the mapping is broken and the step fails fast with this message naming the missing field.

Solutions

  1. Open the OraBulkLoader step dialog and remove or correct the stream field that no longer exists in the input
  2. Check the upstream step's output fields (right-click > Show output fields) and re-map the field with its new name
  3. If upstream columns are dynamic, add a 'Select values' step that guarantees the expected field names before the loader
  4. Re-open and re-save the transformation to rebuild the mapping if it was edited in XML directly

Example fix

// before (mapping references removed field)
fieldStream = new String[] { "cust_id", "cust_nmme" };
// after (name matches upstream Select values output)
fieldStream = new String[] { "cust_id", "cust_name" };
Defensive patterns

Strategy: validation

Validate before calling

// Before executing the transformation, verify mapped stream fields exist:
RowMetaInterface prev = transMeta.getPrevStepFields( stepname );
for ( String f : meta.getFieldStream() ) {
  if ( f != null && prev.searchValueMeta( f ) == null ) {
    throw new IllegalStateException( "Field not produced upstream: " + f );
  }
}

Try / catch

try { stepMeta.check( remarks, transMeta, prev, new String[]{stepname}, null, null, null ); } catch ( KettleStepException e ) { log.error( "Broken field mapping: " + e.getMessage() ); }

Prevention

When it happens

Trigger: A field listed in fieldStream[] (the 'Field stream' mapping in the OraBulkLoader dialog) is not present in the row metadata coming from the previous transform. Typically the mapping table was built, saved, and the upstream step was later renamed or removed the field.

Common situations: Renaming a field in a Select values / Table input step upstream without updating the OraBulkLoader mapping; running a transformation where an earlier conditionally-skipped step no longer emits the column; copying a transformation between environments with different schemas; hand-editing transformation XML/ktr files.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/21b1cd1cbbd01203. Report an issue: GitHub.

Appendix: source

Thrown at plugins/oracle-bulk-loader/impl/src/main/java/org/pentaho/di/trans/steps/orabulkloader/OraBulkLoaderMeta.java:772

  public SQLStatement getSQLStatements( TransMeta transMeta, StepMeta stepMeta, RowMetaInterface prev,
    Repository repository, IMetaStore metaStore ) throws KettleStepException {
    SQLStatement retval = new SQLStatement( stepMeta.getName(), databaseMeta, null ); // default: nothing to do!

    if ( databaseMeta != null ) {
      if ( prev != null && prev.size() > 0 ) {
        // Copy the row
        RowMetaInterface tableFields = new RowMeta();

        // Now change the field names
        for ( int i = 0; i < fieldTable.length; i++ ) {
          ValueMetaInterface v = prev.searchValueMeta( fieldStream[i] );
          if ( v != null ) {
            ValueMetaInterface tableField = v.clone();
            tableField.setName( fieldTable[i] );
            tableFields.addValueMeta( tableField );
          } else {
            throw new KettleStepException( "Unable to find field [" + fieldStream[i] + "] in the input rows" );
          }
        }

        if ( !Utils.isEmpty( tableName ) ) {
          Database db = new Database( loggingObject, databaseMeta );
          db.shareVariablesWith( transMeta );
          try {
            db.connect();

            String schemaTable =
              databaseMeta.getQuotedSchemaTableCombination(
                transMeta.environmentSubstitute( schemaName ), transMeta.environmentSubstitute( tableName ) );
            String sql = db.getDDL( schemaTable, tableFields, null, false, null, true );

            if ( sql.length() == 0 ) {
              retval.setSQL( null );
            } else {
              retval.setSQL( sql );

View on GitHub (pinned to f3058517a1)