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
- 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.
- Install the Oracle client/SQL*Loader on the machine running the transformation if it is absent.
- 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
- Set the sqlldr field immediately when adding the step.
- Install the Oracle client on every node that runs the transformation.
- Add a pre-flight config check to your deployment pipeline.
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
- Error retrieving sqlldr string
- No connection specified
- No control file specified
- OraBulkLoaderMeta.Exception.ConnectionNotDefined
- OraBulkLoaderMeta.Exception.TableNotSpecified
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)