Writer Mode
Many writers that do not support the Feature Operation specification share a Writer Mode specification, which determines whether incoming features will be inserted, updated, or deleted from the destination tables. Some writers deviate from the specification.
The writer mode can be specified at three unique levels:
- Writer
- Table
- Feature
Writer Level
At the writer level, the keyword is <Writer>_MODE, prefixed by the writer keyword (for example, oracle_spatial). Possible values are:
- Insert – Implies insert only; can be overridden only by table-level modes, not feature-level modes.
- Update – Update table, but can be overridden by table- and feature-level modes.
- Delete – Delete from table, but can be overridden by table- and feature-level modes.
Table Level
At the table level, there is a format specific feature type DEF line parameter called _MODE prefixed by the writer keyword. Possible values for this attribute are:
0. Inherit From Writer – Inherits the writer-level writer mode.
1. Insert
2. Update
3. Delete
Feature Level
At the feature level, the writer mode can be set by an attribute named fme_db_operation. Possible values for this attribute are:
0. <no attribute> – Defaults to table level mode
1. INSERT
2. UPDATE
3. DELETE
fme_db_operation overrides the writer and table level writer modes, except for when the table level mode is INSERT, or if the table level mode is Inherit From Writer and writer level mode is Insert.
fme_db_operation is used in conjunction with update/delete key columns, or with the fme_where attribute for update and delete operations at the feature level. If a writer supports both fme_where and update/delete key columns, fme_where overrides update/delete key columns.
Insert example:
WRITER LEVEL: UPDATE
TABLE LEVEL: UPDATE, INSERT or DELETE
feature type roads
num_lanes 5
surface_type gravel
age 106
location canada
condition poor
name Highway 1
road_id 1234
fme_geometry fme_no_geom
fme_db_operation INSERT
This will insert a row into a table named "roads". This will append to an existing table. Columns not specified will receive their default values, if there are default values.
Update example:
WRITER LEVEL: UPDATE
TABLE LEVEL: UPDATE or DELETE
feature type roads
condition good
fme_db_operation UPDATE
fme_where road_id = 1234
This will update the row in the table "roads" where the road_id = 1234. The column "condition" will have its value changed from "poor" to "good".
Delete example:
WRITER LEVEL: UPDATE
TABLE LEVEL: UPDATE or DELETE
feature type roads
fme_db_operation DELETE
fme_where road_id = 1234
This will delete the row in the table "roads" where the road_id = 1234.
Notes:
- Updates performed on rows that DO NOT EXIST are NOT turned into inserts. The user is warned and the feature is rejected.
- Inserts performed on rows that EXIST are NOT turned into updates. FME will still attempt to perform the insert: if it is not prevented by a unique index, it will insert a duplicate row; if it is prevented by a unique index, the feature will be rejected, or translation will fail, depending on the writer.
- Updates are not limited to one row per feature. It is possible to update the entire table with one feature.
-
Geometry can also be updated using update mode. The geometry on the update feature will replace the geometry in all of the matched rows, with one exception. If a feature has no geometry, the destination geometry column will either be replaced with a null value, or not be updated, depending on the writer.