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
- Verify the table exists in the Access file (open it in Access or a viewer)
- Correct the table name in the step settings, matching exact casing
- Check the environment variable used in the table name resolves correctly
- Confirm the step points at the intended database file
- 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
- List tables in the Access file before configuring the step
- Match table name exactly (case/whitespace)
- Define table-name variables in the runtime environment
- Track schema changes in the Access DB source
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
- AccessOutputMeta.Exception.FileDoesNotExist
- AccessInputMeta.Exception.FileDoesNotExist
- AccessOutputMeta.Exception.ErrorGettingFields
- AccessOutputMeta.Exception.FileDoesNotExist
- AvroInput.Error.MutipleDifferentExpansions
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)