dbaccess - стандартная клиентская программа, предназначенная для выполнения SQL-запросов в базах данных Informix. Отдельно от СУБД не поставляется. Вызывается только из командной строки.
В комплекте документации Informix имеется весьма подробное 150-страничное руководство по использованию этой утилиты - DB-Access User's Guide, так что здесь приведен только необходимый минимум.
Утилита может быть использована в двух режимах:
В пакетном режиме текст SQL-запроса (запросов) должен быть либо взят из внешнего файла, либо любым удобным способом передан на стандартный ввод программы.
Если текст SQL хранится в файле, например, с именем 22.sql, исполнить его можно так:
~dbuser > dbaccess имя_базы 22.sql
С большими скриптами так и следует поступать. Однако, если нужно по-быстрому выполнить что-то несложное, не обязательно тратить время на подготовку исходного файла. Например, простенький запрос, текст которого легко набрать, можно выполнить так:
~dbuser > echo select tabid from systables | dbaccess имя_базы
Текст запроса - "select tabid from systables" - выдает команда echo. Параметр самой dbaccess - имя базы данных. В пакетном режиме имя базы указывать обязательно (конечно, если не передавать еще и запрос CONNECT, но вам вряд ли захочется так делать)
Результат исполнения запросов и все сообщения выдаются на стандартный вывод:
~dbuser > echo select tabid from systables | dbaccess имя_базы Database selected. tabid 1 2 . . . . . . . . . 71 90 91 99 70 row(s) retrieved. Database closed. ~dbuser >
(для экономии места текст выдачи несколько урезан.) Видно, что утилита выдает сообщения о подключении к базе, о количестве полученных по запросу строк и, наконец, об отключении от БД.
Таким способом можно выполнить и скрипт:
~dbuser > echo 'select count(*) from systables; select count(*) from heavytable where status is null' | dbaccess имя_базы Database selected. (count(*)) 70 1 row(s) retrieved. (count(*)) 112 1 row(s) retrieved. Database closed.
В этом скрипте - два запроса сразу. Первый запрос подсчитывает число записей в системной таблице systables, второй - число записей в таблице heavytable, в которых не заполнено поле status.
Разумеется, текст SQL-скрипта можно взять из файла. Допустим, в файле 1.sql содержится текст:
create table tab1 ( ident serial not null, docname varchar(80) not null, quantity integer, -- quantity in this document destroyed boolean ) lock mode row; create unique index tab1_index1 on tab1 (ident); alter table tab1 add constraint primary key (ident) constraint pk_tab1;
Исполнить этот скрипт можно так:
~dbuser > cat 1.sql | dbaccess имя_базы Database selected. Table created. Index created. Table altered. Database closed.
В пакетном режиме весь скрипт по умолчанию выполняется от начала до конца, независимо от того, были ли обнаружены ошибки. Например, скрипт может выглядеть так:
create table tab2 ( ident serial not null, docname varchar(80) not null, quantity integer, -- quantity in this document destroyed boolean ) lock mode row; create unique index tab2_index1 on tab22 (ident); alter table tab2 add constraint primary key (ident) constraint pk_tab2;
Место ошибки отмечено желтым цветом (указано имя несуществующей таблицы). Выполним:
~dbuser > dbaccess имя_базы 1.sql Database selected. Table created. 206: The specified table (tab22) is not in the database. 111: ISAM error: no record found. Error in line 1 Near character position 42 Table altered. Database closed.
Запрос на создание индекса не выполнен, так как таблица tab22 в базе не найдена. Однако следующий далее запрос alter table отработал вполне нормально.
В последних версиях dbaccess добавлена новая опция -a - она позволяет прекратить выполнение запроса после первой же ошибки.
~dbuser > dbaccess -a имя_базы 1.sql