dbaccess

dbaccess - стандартная клиентская программа, предназначенная для выполнения SQL-запросов в базах данных Informix. Отдельно от СУБД не поставляется. Вызывается только из командной строки.

В комплекте документации Informix имеется весьма подробное 150-страничное руководство по использованию этой утилиты - DB-Access User's Guide, так что здесь приведен только необходимый минимум.

Утилита может быть использована в двух режимах:

пакетный режим
используется, если при вызове dbaccess на ее стандартный ввод передан какой-либо текст. Этот текст интерпретируется как SQL-скрипт - то есть последовательность запросов SQL, разделенных точками с запятой.
диалоговый режим
используется, если при вызове на стандартном вводе не обнаружено никакой информации

Пакетный режим работы

В пакетном режиме текст 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