pentaho/pentaho-kettle · error · KettleException

OraBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository

Error message

OraBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository

What it means

saveRep() persists the step's settings to the repository; any Exception is wrapped in a KettleException with OraBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository plus id_step. The step-database relationship insert (insertStepDatabase) and attribute writes are the usual sources. The transformation is not saved for this step until fixed.

Solutions

  1. Check the cause chain and repository logs for the underlying SQL/privilege error
  2. Ensure the repository user has write privileges on the repository tables
  3. Test/re-establish the repository connection and retry the save
  4. If the repository is intentionally read-only, save the transformation as a local .ktr file instead
Defensive patterns

Strategy: try-catch

Validate before calling

// ensure the repository user can write before saving
// (run a probe write or check grants in the repository DB)
rep.insertStepDatabase( id_transformation, id_step, dbMeta.getObjectId() ); // will throw if not writable

Try / catch

try {
  transMeta.saveRep( rep, metaStore, "transformation-name" );
} catch ( KettleException e ) {
  if ( e.getMessage().contains( "UnableToSaveStepInfoToRepository" ) ) {
    // fall back to saving as a local .ktr file
  }
}

Prevention

When it happens

Trigger: rep.saveStepAttribute*/insertStepDatabase throws during saveRep — repository connection loss, read-only repository user, constraint violation, or duplicate object ids.

Common situations: Saving a transformation with a repository user lacking INSERT/UPDATE privileges; network drop to the repository database mid-save; saving to a read-only production repository; stale repository sessions after timeouts.

Related errors


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

Appendix: source

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

      rep.saveStepAttribute( id_transformation, id_step, "character_set", characterSetName );
      rep.saveStepAttribute( id_transformation, id_step, "fail_on_warning", failOnWarning );
      rep.saveStepAttribute( id_transformation, id_step, "fail_on_error", failOnError );
      rep.saveStepAttribute( id_transformation, id_step, "parallel", parallel );
      rep.saveStepAttribute( id_transformation, id_step, "alt_rec_term", altRecordTerm );

      for ( int i = 0; i < fieldTable.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "stream_name", fieldTable[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "field_name", fieldStream[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "date_mask", dateMask[i] );
      }

      // Also, save the step-database relationship!
      if ( databaseMeta != null ) {
        rep.insertStepDatabase( id_transformation, id_step, databaseMeta.getObjectId() );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "OraBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository" )
        + id_step, e );
    }
  }

  @Override
  public void getFields( Bowl bowl, RowMetaInterface rowMeta, String origin, RowMetaInterface[] info, StepMeta nextStep,
    VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
    // Default: nothing changes to rowMeta
  }

  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,
                    RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,
                    Repository repository, IMetaStore metaStore ) {
    CheckResult cr;
    String error_message = "";

    if ( databaseMeta != null ) {

View on GitHub (pinned to f3058517a1)