{"record":{"id":"6f66213e8f783cca","repo":"pentaho/pentaho-kettle","slug":"no-control-file-specified-orabulkloader","errorCode":null,"errorMessage":"No control file specified","messagePattern":"No control file 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":373,"sourceCode":"        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() ) ) {\n      sb.append( \" data=\\'-\\'\" );\n    }\n\n    if ( meta.getLogFile() != null ) {\n      try {\n        FileObject fileObject =\n          getFileObject( meta.getLogFile(), getTransMeta() );\n\n        sb.append( \" log=\\'\" );\n        sb.append( getFilename( fileObject ) );\n        sb.append( \"\\'\" );\n      } catch ( KettleFileException ex ) {\n        throw new KettleException( \"Error retrieving logfile string\", ex );\n      }\n    }","sourceCodeStart":355,"sourceCodeEnd":391,"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#L355-L391","documentation":"sqlldr cannot run without a control file, so createCommandLine demands one: if meta.getControlFile() is null or empty after the sqlldr executable, this KettleException is thrown instead of appending control='...' to the command line.","triggerScenarios":"meta.getControlFile() == null when createCommandLine is invoked from execute — the control file name/directory field is blank in the step settings.","commonSituations":"User assumed the step auto-generates and auto-names the control file location but left the field empty; configuration exported/imported and the field lost; running headless with a ktr whose step config is incomplete.","solutions":["Set the control file field in the step dialog to a path the step can write to, e.g. /tmp/orabulk/load.ctl.","Ensure the target directory exists and the runtime user has write permission.","Re-save and validate the transformation so the field persists in the ktr."],"exampleFix":"// before\n<control_file/>\n// after\n<control_file>/tmp/orabulk/load.ctl</control_file>","handlingStrategy":"validation","validationCode":"// Java: verify a control file location is configured before execution\nif (meta.getControlFile() == null || meta.getControlFile().trim().isEmpty()) {\n  throw new IllegalArgumentException(\n    \"Oracle Bulk Loader: control file path is required, e.g. /tmp/orabulk/load.ctl\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  trans.execute(null);\n} catch (KettleException e) {\n  if (String.valueOf(e.getMessage()).contains(\"No control file specified\")) {\n    // guide user to set the control file field in the step dialog\n  }\n}","preventionTips":["Always fill both sqlldr and control file fields when configuring the step.","Validate step configuration programmatically before scheduling transformations.","Keep a template ktr with required loader fields pre-filled."],"tags":["kettle","oracle","control-file","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"}