pentaho/pentaho-kettle · error · KettleException

No sqlldr application specified

Error message

No sqlldr application specified

What it means

createCommandLine requires a sqlldr executable to build the SQL*Loader invocation. If meta.getSqlldr() is null or empty, no command can be constructed and this KettleException is thrown before any other argument is appended.

Solutions

  1. Open the Oracle Bulk Loader step and set the sqlldr field, e.g. 'sqlldr' (if on PATH) or the full path to the SQL*Loader executable.
  2. Install the Oracle client/SQL*Loader on the machine running the transformation if it is absent.
  3. Verify the field is non-empty after variable substitution in the saved ktr.

Example fix

// before
<sqlldr/>
// after
<sqlldr>/opt/oracle/product/19c/client_1/bin/sqlldr</sqlldr>
Defensive patterns

Strategy: validation

Validate before calling

// Java: fail fast with a clear message before running the transformation
if (meta.getSqlldr() == null || meta.getSqlldr().trim().isEmpty()) {
  throw new IllegalArgumentException(
    "Oracle Bulk Loader: 'sqlldr' location must be set (e.g. /opt/oracle/.../bin/sqlldr or 'sqlldr' on PATH).");
}

Try / catch

try {
  trans.execute(null);
} catch (KettleException e) {
  if (String.valueOf(e.getMessage()).contains("No sqlldr application specified")) {
    // prompt operator to set the sqlldr executable field
  }
}

Prevention

When it happens

Trigger: meta.getSqlldr() == null when createCommandLine is called by execute — the 'sqlldr' location field in the Oracle Bulk Loader step was never filled in (or evaluated empty).

Common situations: Fresh step added and the 'sqlldr' field left blank; Oracle client not installed so the user left the field empty; configuration migrated to a new server and the field was cleared; environment variable yielding empty string.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


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

Appendix: source

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

   * @return The string to execute.
   *
   * @throws KettleException
   *           Upon any exception
   */
  public String createCommandLine( OraBulkLoaderMeta meta, boolean password ) throws KettleException {
    StringBuilder sb = new StringBuilder( 300 );

    if ( meta.getSqlldr() != null ) {
      try {
        FileObject fileObject =
          getFileObject( meta.getSqlldr(), getTransMeta() );
        String sqlldr = getFilename( fileObject );
        sb.append( sqlldr );
      } catch ( KettleFileException ex ) {
        throw new KettleException( "Error retrieving sqlldr string", ex );
      }
    } else {
      throw new KettleException( "No sqlldr application specified" );
    }

    if ( meta.getControlFile() != null ) {
      try {
        FileObject fileObject =
          getFileObject( meta.getControlFile(), getTransMeta() );

        sb.append( " control=\'" );
        sb.append( getFilename( fileObject ) );
        sb.append( "\'" );
      } catch ( KettleFileException ex ) {
        throw new KettleException( "Error retrieving controlfile string", ex );
      }
    } else {
      throw new KettleException( "No control file specified" );
    }

    if ( OraBulkLoaderMeta.METHOD_AUTO_CONCURRENT.equals( meta.getLoadMethod() ) ) {

View on GitHub (pinned to f3058517a1)