Starting with version 0.15.1 the odb header tool can produce description of given file's metadata using CREATE TABLE syntax compatible with ODB API SQL, for example:

$ odb header conv.odb -ddl -table conv


will produce:

CREATE TYPE report_status@hdr_at_conv_t AS (active bit1, passive bit1, rejected bit1, blacklisted bit1, use_emiskf_only bit1);
CREATE TYPE report_event1@hdr_at_conv_t AS (no_data bit1, all_rejected bit1, bad_practice bit1, rdb_rejected bit1, redundant bit1, stalt_missing bit1, qc_failed bit1, overcast_ir bit1, thinned bit1, latlon_corrected bit1, stalt_corrected bit1);
CREATE TYPE report_rdbflag@hdr_at_conv_t AS (lat_humon bit1, lat_qcsub bit1, lat_override bit1, lat_flag bit2, lat_hqc_flag bit1, lon_humon bit1, lon_qcsub bit1, lon_override bit1, lon_flag bit2, lon_hqc_flag bit1, date_humon bit1, date_qcsub bit1, date_override bit1, date_flag bit2, date_hqc_flag bit1, time_humon bit1, time_qcsub bit1, time_override bit1, time_flag bit2, time_hqc_flag bit1, stalt_humon bit1, stalt_qcsub bit1, stalt_override bit1, stalt_flag bit2, stalt_hqc_flag bit1);
CREATE TYPE datum_anflag@body_at_conv_t AS (final bit4, fg bit4, depar bit4, varqc bit4, blacklist bit4, ups bit1, uvt bit1, uhu bit1, ut2 bit1, uh2 bit1, uv1 bit1, urr bit1, usn bit1, usst bit1);
CREATE TYPE datum_status@body_at_conv_t AS (active bit1, passive bit1, rejected bit1, blacklisted bit1, use_emiskf_only bit1);
CREATE TYPE datum_event1@body_at_conv_t AS (vertco_missing bit1, obsvalue_missing bit1, fg_missing bit1, rdb_rejected bit1, assim_cld_flag bit1, bad_practice bit1, vertpos_outrange bit1, fg2big bit1, depar2big bit1, obs_error2big bit1, datum_redundant bit1, level_redundant bit1, not_analysis_varno bit1, duplicate bit1, levels2many bit1, level_selection bit1, vertco_consistency bit1, vertco_type_changed bit1, combined_flagging bit1, report_rejected bit1, varqc_performed bit1, obserror_increased bit1, contam_cld_flag bit1, contam_rain_flag bit1, contam_aerosol_flag bit1, bad_emissivity bit1, model_cld_flag bit1);
CREATE TYPE datum_rdbflag@body_at_conv_t AS (press_humon bit1, press_qcsub bit1, press_override bit1, press_flag bit2, press_hqc_flag bit1, press_judged_prev_an bit2, press_used_prev_an bit1, _press_unused_6 bit6, varno_humon bit1, varno_qcsub bit1, varno_override bit1, varno_flag bit2, varno_hqc_flag bit1, varno_judged_prev_an bit2, varno_used_prev_an bit1);
 type INTEGER,
 expver STRING,
 class INTEGER,
 stream INTEGER,
 andate INTEGER,
 antime INTEGER,
 reportype INTEGER,
 mxup_traj@desc INTEGER,
 numtsl@desc INTEGER,
 timeslot@timeslot_index INTEGER,
 seqno@hdr INTEGER,
 bufrtype@hdr INTEGER,
 subtype@hdr INTEGER,
 groupid@hdr INTEGER,
 obstype@hdr INTEGER,
 codetype@hdr INTEGER,
 sensor@hdr INTEGER,
 statid@hdr STRING,
 date@hdr INTEGER,
 time@hdr INTEGER,
 report_status@hdr report_status@hdr_at_conv_t,
 report_event1@hdr report_event1@hdr_at_conv_t,
 report_rdbflag@hdr report_rdbflag@hdr_at_conv_t,
 lat@hdr REAL,
 lon@hdr REAL,
 lsm@modsurf REAL,
 orography@modsurf REAL,
 stalt@hdr REAL,
 sonde_type INTEGER,
 station_type INTEGER,
 entryno@body INTEGER,
 obsvalue@body REAL,
 varno@body INTEGER,
 vertco_type@body INTEGER,
 vertco_reference_1@body REAL,
 vertco_reference_2@body REAL,
 ppcode@conv_body INTEGER,
 datum_anflag@body datum_anflag@body_at_conv_t,
 datum_status@body datum_status@body_at_conv_t,
 datum_event1@body datum_event1@body_at_conv_t,
 datum_rdbflag@body datum_rdbflag@body_at_conv_t,
 biascorr@body REAL,
 biascorr_fg@body REAL,
 an_depar@body REAL,
 fg_depar@body REAL,
 qc_pge@body REAL,
 fc_sens_obs@body REAL,
 an_sens_obs@body REAL,
 obs_error@errstat REAL,
 final_obs_error@errstat REAL,
 fg_error@errstat REAL,
 eda_spread@errstat REAL,
 hires@update_2 REAL,
) ON 'conv.odb';

The file used in this example was retrieved from ECMWF archive (MARS):

$ echo retrieve,type=mfb,obsgroup=conv,target=conv.odb | mars