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

  1. Validate/repair the step's XML block against a known-good DB Procedure step definition.
  2. Re-create the step in Spoon to regenerate its XML defaults.
  3. Align engine and file versions (upgrade the engine or re-save with the current Spoon).
  4. 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

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


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)