Чтобы прочитать данные из реляционной таблицы, затем записать результаты в эту же таблицу, можно использовать два отдельных объявления table (чтение и запись). Либо объединить эти объявления в одно, которое определит столбцы для чтения и столбцы для записи.
Чтение и запись с использованием двух табличных объявлений
Одна внешняя таблица может быть прочитана одним объявлением таблицы, а затем записана другим объявлением. Две декларации table соответствуют правилам чтения и записи, приведенным в других разделах. При таком способе обычно требуется, чтобы команда write table добавляла или перезаписывала выбранные столбцы, а не перезаписывала всю таблицу. Это предпочтение может быть передано обработчику таблицы AMPL путем включения входных, а также выходных столбцов в объявление таблицы, которое будет использоваться для записи. Столбцы, предназначенные для импорта в AMPL, можно отличить от столбцов, предназначенных для экспорта во внешнюю таблицу, указав столбец состояния чтения / записи для столбца (а не для таблицы в целом). Например, внешняя таблица для diet.mod может состоять из столбцов cost, f_min и f_max, содержащих входные данные для модели, и столбца Buy, содержащего результаты. Объявление таблицы для чтения данных в AMPL может иметь следующий вид:
table FoodInput IN "ODBC" "diet1.mdb" "Diet": FOOD <- [FoodName], cost, f_min, f_max;
Указанное объявление записи результатов связывает различные имена реляционной таблицы и таблицы AMPL :
table FoodOutput "ODBC" "diet1.mdb" "Diet": [FoodName], cost IN, f_min IN, Buy OUT, f_max IN;
Когда выполняется чтение таблицы FoodInput, читаются только три столбца, перечисленные в объявлении таблицы FoodInput. Столбец с именем Buy игнорируется если он существует. Позже, когда проблема будет решена, таблица FoodOutput запишет в таблицу Access только один столбец, имеющий состояние чтения / записи OUT. Остальные столбцы таблицы остаются неизменными. Детали могут различаться в зависимости от используемого программного обеспечения базы данных. Общее соглашение состоит в том, что перезапись всей существующей таблицы или файла базы данных происходит только в случае, если сама таблица либо все столбцы данных в объявлении таблицы имеют статус чтения / записи OUT. В остальных случаях происходит выборочная перезапись или добавление столбцов. Если таблица AMPL для вывода была объявлена:
table FoodOutput "ODBC" "diet1.mdb" "Diet":[FoodName], Buy OUT;
тогда все столбцы данных в таблице Diet были бы удалены таблицей записи FoodOutput. Альтернативой является запись:
table FoodOutput "ODBC" "diet1.mdb" "Diet":[FoodName],Buy;
которая перезапишет только столбец Buy. По умолчанию, когда статус не задан предполагается INOUT.
Чтение и запись с использованием одной и той же декларации таблицы
Во многих случаях, вся информация для чтения и записи внешней таблицы может быть указана в одной и той же декларации таблицы. Спецификация ключа может использовать стрелку <- для чтения содержимого ключевых столбцов в набор AMPL, и стрелку -> для записи элементов набора AMPL в ключевые столбцы. Может применяться вариант стрелки <-> для выполнения чтения и записи. Спецификация данных может указывать статус чтения / записи IN для столбца, который будет считан только в AMPL, OUT для столбца, который будет записан только из AMPL, или INOUT для столбца, который будет прочитан и записан.
Команда read table table-name, читает только те столбцы ключа или данных, которые указаны в объявлении table-name как IN или INOUT. Команда записи таблицы table-name, записывает только в столбцы, которые указаны как OUT или INOUT. Например, объявления, определяющие FoodInput и FoodOutput в выражениях выше, могут быть заменены на:
table Foods "ODBC" "diet1.mdb" "Diet": FOOD <- [FoodName], cost IN, f_min IN, Buy OUT, f_max IN;
Таблица Foods будет читать только из ключевого столбца FoodName и столбцов данных cost, f_min и f_max. Более поздняя запись таблицы Foods будет записывать данные только в столбец Buy.