{"record":{"id":"2769e70263b40b6d","repo":"pentaho/pentaho-kettle","slug":"no-sqlldr-application-specified","errorCode":null,"errorMessage":"No sqlldr application specified","messagePattern":"No sqlldr application specified","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/oracle-bulk-loader/impl/src/main/java/org/pentaho/di/trans/steps/orabulkloader/OraBulkLoader.java","lineNumber":358,"sourceCode":"   * @return The string to execute.\n   *\n   * @throws KettleException\n   *           Upon any exception\n   */\n  public String createCommandLine( OraBulkLoaderMeta meta, boolean password ) throws KettleException {\n    StringBuilder sb = new StringBuilder( 300 );\n\n    if ( meta.getSqlldr() != null ) {\n      try {\n        FileObject fileObject =\n          getFileObject( meta.getSqlldr(), getTransMeta() );\n        String sqlldr = getFilename( fileObject );\n        sb.append( sqlldr );\n      } catch ( KettleFileException ex ) {\n        throw new KettleException( \"Error retrieving sqlldr string\", ex );\n      }\n    } else {\n      throw new KettleException( \"No sqlldr application specified\" );\n    }\n\n    if ( meta.getControlFile() != null ) {\n      try {\n        FileObject fileObject =\n          getFileObject( meta.getControlFile(), getTransMeta() );\n\n        sb.append( \" control=\\'\" );\n        sb.append( getFilename( fileObject ) );\n        sb.append( \"\\'\" );\n      } catch ( KettleFileException ex ) {\n        throw new KettleException( \"Error retrieving controlfile string\", ex );\n      }\n    } else {\n      throw new KettleException( \"No control file specified\" );\n    }\n\n    if ( OraBulkLoaderMeta.METHOD_AUTO_CONCURRENT.equals( meta.getLoadMethod() ) ) {","sourceCodeStart":340,"sourceCodeEnd":376,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/oracle-bulk-loader/impl/src/main/java/org/pentaho/di/trans/steps/orabulkloader/OraBulkLoader.java#L340-L376","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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."],"exampleFix":"// before\n<sqlldr/>\n// after\n<sqlldr>/opt/oracle/product/19c/client_1/bin/sqlldr</sqlldr>","handlingStrategy":"validation","validationCode":"// Java: fail fast with a clear message before running the transformation\nif (meta.getSqlldr() == null || meta.getSqlldr().trim().isEmpty()) {\n  throw new IllegalArgumentException(\n    \"Oracle Bulk Loader: 'sqlldr' location must be set (e.g. /opt/oracle/.../bin/sqlldr or 'sqlldr' on PATH).\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  trans.execute(null);\n} catch (KettleException e) {\n  if (String.valueOf(e.getMessage()).contains(\"No sqlldr application specified\")) {\n    // prompt operator to set the sqlldr executable field\n  }\n}","preventionTips":["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."],"tags":["kettle","oracle","sqlldr","missing-config"],"backgroundTag":"missing-required-config-field","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}