pentaho/pentaho-kettle · error · KettleXMLException
DBProcMeta.Exception.UnableToReadStepInfo
DBProcMeta.Exception.UnableToReadStepInfo
Error message
DBProcMeta.Exception.UnableToReadStepInfo
What it means
DBProcMeta.readData parses the DB Procedure step's XML definition (connection, procedure name, arguments, result). Any exception during XML parsing is wrapped in this localized KettleXMLException so the transformation fails to load with the standard 'unable to read step info' message.
Solutions
- Validate/repair the step's XML block against a known-good DB Procedure step definition.
- Re-create the step in Spoon to regenerate its XML defaults.
- Align engine and file versions (upgrade the engine or re-save with the current Spoon).
- Read the chained cause to find the exact XML element that failed parsing.
Example fix
// before: missing result block <step><type>DBProc</type><procedure>MY_PROC</procedure></step> // after <step><type>DBProc</type><procedure>MY_PROC</procedure><result><name>res</name><type>String</type></result></step>
Defensive patterns
Strategy: try-catch
Validate before calling
if (XMLHandler.getSubNode(stepnode,"procedure") == null)
throw new IllegalArgumentException("DBProc step XML missing <procedure>"); Type guard
boolean hasProcedure(Node n){ return XMLHandler.getSubNode(n,"procedure") != null; } Try / catch
try { meta.loadXML(stepnode, databases, metaStore); }
catch (KettleXMLException e) {
logError("DBProc XML load failed: " + e.getCause(), e);
} Prevention
- Keep engine version aligned with transformation file version.
- Avoid hand-editing .ktr XML.
- Validate step XML structure before load.
- Always inspect the chained cause for the parsing failure.
When it happens
Trigger: loadXML encounters a malformed or unexpected <step> node: missing <procedure>, <argument>, or <result> elements, or invalid values passed to ValueMetaFactory.getIdForValueMeta for the result type.
Common situations: Hand-edited .ktr files; transformations from a newer Pentaho version read by an older engine; XML with missing connection references or corrupted argument blocks.
Understand the failure class
Background: JSON parse error: "Unexpected token" / "not valid JSON" / "failed to parse" — what JSON parsers are really complaining about — this error's family across 45 libraries.
Related errors
- Unable to load step info from XML
- MergeJoinMeta.Exception.UnableToLoadStepInfo
- MergeRowsMeta.Exception.UnableToLoadStepInfo
- PGPEncryptStreamMeta.Exception.UnableToReadStepInfo
- StepWithMappingMeta.Exception.UnableToLoadTrans
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/1a030148cda8ddf5.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/dbproc/DBProcMeta.java:333
Node lookup = XMLHandler.getSubNode( stepnode, "lookup" );
nrargs = XMLHandler.countNodes( lookup, "arg" );
allocate( nrargs );
for ( i = 0; i < nrargs; i++ ) {
Node anode = XMLHandler.getSubNodeByNr( lookup, "arg", i );
argument[i] = XMLHandler.getTagValue( anode, "name" );
argumentDirection[i] = XMLHandler.getTagValue( anode, "direction" );
argumentType[i] = ValueMetaFactory.getIdForValueMeta( XMLHandler.getTagValue( anode, "type" ) );
}
resultName = XMLHandler.getTagValue( stepnode, "result", "name" ); // Optional, can be null
//
resultType = ValueMetaFactory.getIdForValueMeta( XMLHandler.getTagValue( stepnode, "result", "type" ) );
autoCommit = !"N".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "auto_commit" ) );
} catch ( Exception e ) {
throw new KettleXMLException( BaseMessages.getString( PKG, "DBProcMeta.Exception.UnableToReadStepInfo" ), e );
}
}
public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases ) throws KettleException {
try {
database = rep.loadDatabaseMetaFromStepAttribute( id_step, "id_connection", databases );
procedure = rep.getStepAttributeString( id_step, "procedure" );
int nrargs = rep.countNrStepAttributes( id_step, "arg_name" );
allocate( nrargs );
for ( int i = 0; i < nrargs; i++ ) {
argument[i] = rep.getStepAttributeString( id_step, i, "arg_name" );
argumentDirection[i] = rep.getStepAttributeString( id_step, i, "arg_direction" );
argumentType[i] = ValueMetaFactory.getIdForValueMeta( rep.getStepAttributeString( id_step, i, "arg_type" ) );
}
resultName = rep.getStepAttributeString( id_step, "result_name" );View on GitHub (pinned to f3058517a1)