{"record":{"id":"b8e2af234b5e4dd7","repo":"pentaho/pentaho-kettle","slug":"internal-error-no-sqlldr-process-running","errorCode":null,"errorMessage":"Internal error: no sqlldr process running","messagePattern":"Internal error: no sqlldr process running","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":534,"sourceCode":"          }\n\n          String loadMethod = meta.getLoadMethod();\n          if ( OraBulkLoaderMeta.METHOD_AUTO_END.equals( loadMethod ) ) {\n            // if this is the first line, we do not need to execute loader\n            // control file may not exists\n            if ( !first ) {\n              execute( meta, true );\n              sqlldrProcess = null;\n            }\n          } else if ( OraBulkLoaderMeta.METHOD_AUTO_CONCURRENT.equals( meta.getLoadMethod() ) ) {\n            try {\n              if ( sqlldrProcess != null ) {\n                int exitVal = sqlldrProcess.waitFor();\n                sqlldrProcess = null;\n                logBasic( BaseMessages.getString( PKG, \"OraBulkLoader.Log.ExitValueSqlldr\", \"\" + exitVal ) );\n                checkExitVal( exitVal );\n              } else if ( !first ) {\n                throw new KettleException( \"Internal error: no sqlldr process running\" );\n              }\n            } catch ( Exception ex ) {\n              throw new KettleException( \"Error while executing sqlldr\", ex );\n            }\n          }\n        }\n        return false;\n      }\n\n      if ( !preview ) {\n        if ( first ) {\n          first = false;\n\n          String recTerm = Const.CR;\n          if ( !Utils.isEmpty( meta.getAltRecordTerm() ) ) {\n            recTerm = substituteRecordTerminator( meta.getAltRecordTerm() );\n          }\n","sourceCodeStart":516,"sourceCodeEnd":552,"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#L516-L552","documentation":"At the end of the stream-load path processRow expects a running sqlldr process to wait for; if sqlldrProcess is null on a non-first row it throws this internal invariant error. It indicates the process handle was consumed or never created despite rows being processed.","triggerScenarios":"load method is 'wait for database stream', first==false, and sqlldrProcess == null when the step reaches the waitFor block — i.e. the process handle was already nulled or execute() failed to spawn it.","commonSituations":"Race or re-entry into processRow after the process already completed; a failed/aborted prior batch leaving data.sqlldrProcess null; programming-level state corruption rather than a user configuration problem.","solutions":["Re-run the transformation; this is an internal state error, often secondary to an earlier swallowed failure","Check earlier step logs for a failed execute() that never spawned sqlldr","Report/inspect with the Pentaho version — if reproducible with a clean transformation it is a step bug","Switch the load method to 'auto conventional' as a workaround if the streaming path keeps corrupting state"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  step.processRow( smi, sdi );\n} catch ( KettleException e ) {\n  if ( e.getMessage().contains( \"no sqlldr process running\" ) ) {\n    // internal state issue: restart the transformation from a clean state\n  }\n}","preventionTips":["Always start the transformation from init; never re-enter processRow after aborts","Report reproducible cases to the Pentaho maintainers with version and steps","Use the conventional load method if the streaming path repeatedly fails"],"tags":["oracle","sqlldr","internal-state","invariant"],"backgroundTag":"internal-invariant-violation","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"}