pentaho/pentaho-kettle · error · KettleException

AccessOutputMeta.Exception.TableDoesNotExist

AccessOutputMeta.Exception.TableDoesNotExist

Error message

AccessOutputMeta.Exception.TableDoesNotExist

What it means

While reading required fields, AccessOutputMeta opens the Access database read-only and calls db.getTable(realTablename). If the configured table does not exist in the database, getTable returns null and a KettleException with AccessOutputMeta.Exception.TableDoesNotExist is thrown.

Solutions

  1. Verify the table exists in the Access file (open it in Access or a viewer)
  2. Correct the table name in the step settings, matching exact casing
  3. Check the environment variable used in the table name resolves correctly
  4. Confirm the step points at the intended database file
  5. Recreate the table in the Access database if it was dropped

Example fix

// before
meta.setTablename("${TABLE_VAR}");
// after
Database db = new DatabaseBuilder(file).setReadOnly(true).open();
if (!db.getTableNames().contains(resolvedTable)) {
  throw new IllegalStateException("Table missing: " + resolvedTable);
}
meta.setTablename(resolvedTable);
Defensive patterns

Strategy: validation

Validate before calling

try (Database db = new DatabaseBuilder(file).setReadOnly(true).open()) {
  String t = space.environmentSubstitute(meta.getTablename());
  if (!db.getTableNames().contains(t)) {
    throw new IllegalArgumentException("Table not found in Access DB: " + t);
  }
}

Prevention

When it happens

Trigger: getRequiredFields invoked when the tablename configured in the step (after variable substitution) has no matching table in the .mdb/.accdb file, including case or whitespace mismatches.

Common situations: Table renamed or dropped since the step was configured; wrong table name typo; variable substitution resolving to a different table name; pointing the step at a different Access file that lacks the table.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/fd4accd92690c21f. Report an issue: GitHub.

Appendix: source

Thrown at plugins/ms-access/impl/src/main/java/org/pentaho/di/trans/steps/accessoutput/AccessOutputMeta.java:259

  public StepDataInterface getStepData() {
    return new AccessOutputData();
  }

  public RowMetaInterface getRequiredFields( VariableSpace space ) throws KettleException {
    String realFilename = space.environmentSubstitute( filename );
    File file = new File( realFilename );
    try {
      if ( !file.exists() || !file.isFile() ) {
        throw new KettleException( BaseMessages.getString(
          PKG, "AccessOutputMeta.Exception.FileDoesNotExist", realFilename ) );
      }

      // Open the database in read-only mode and get the table metadata.
      try ( Database db = new DatabaseBuilder( file ).setReadOnly( true ).open() ) {
        String realTablename = space.environmentSubstitute( tablename );
        Table table = db.getTable( realTablename );
        if ( table == null ) {
          throw new KettleException( BaseMessages.getString(
            PKG, "AccessOutputMeta.Exception.TableDoesNotExist", realTablename ) );
        }

        return getLayout( table );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG, "AccessOutputMeta.Exception.ErrorGettingFields" ), e );
    }
  }

  public static final RowMetaInterface getLayout( Table table ) throws KettleStepException {
    RowMetaInterface row = new RowMeta();
    List<? extends Column> columns = table.getColumns();
    for ( int i = 0; i < columns.size(); i++ ) {
      ColumnLayout layout = resolveColumnLayout( columns.get( i ) );
      row.addValueMeta( createValueMeta( columns.get( i ).getName(), layout ) );
    }

View on GitHub (pinned to f3058517a1)