18. Работа с утилитой Windows Interactive SQL (WISQL)

 

18.1. Установка набора символов текущей сессии *

18.2. Создание БД *

18.3. Соединение с БД *

18.4. Выполнение SQL-операторов *

18.5. Подтверждение и откат изменений *

18.6. Просмотр структуры компонентов БД *

18.7. Просмотр структуры БД *

18.8. Установка режимов работы WISQL *

18.9. Выполнение Script-файлов *

18. Работа с утилитой Windows Interactive SQL (WISQL)

Утилита WISQL позволяет:

• соединяться с БД на локальном или удаленном сервере;

• выполнять любые запросы к БД и просматривать результаты их выполнения;

• получать информацию о структуре БД.

18.1. Установка набора символов текущей сессии

Как известно, в БД могут храниться символьные данные, использующие различные наборы символов для указания той или иной национальной кодировки. Для того, чтобы не возникало никаких проблем для обработки русскоязычных данных, перед соединением с БД (созданной с указанием DEFAULT CHARACTER SET WIN1251) необходимо выбрать элемент меню Session | Advanced Settings и установить в поле Character Set On кодировку WIN1251 (рис. 18.1), после чего нажать кнопку Ok.

18.2. Создание БД

Для создания БД необходимо выбрать элемент меню Ei/el Create Database и затем в появившемся окне ввести необходимую информацию (рис. 18.2).

Location Info - информация о расположении создаваемой БД. Local Server -данный компьютер; Remote Server - удаленный компьютер. В последнем случае необходимо указать имя сервера (поле Server) и сетевой протокол (поле Net Work Protocol). В случае использования удаленного сервера:

1) его IP-адрес и имя должны быть описаны в файле HOSTS, например: 10.12.0.41 spv

2) протокол доступа к InterBase должен быть описан в файле SERVICE: gds_db 3050/tcp

Оба указанных файла находятся в каталоге WINDOWS.

Database Name - определяет имя создаваемой БД и полный путь к ней (поле Database). Далее необходимо ввести имя пользователя (поле User Name) и пароль (поле Password).

Default Option - параметры создаваемой БД. Именно в данном поле вводятся принимаемый по умолчанию набор символов (DEFAULT CHARACTER SET) и другие параметры, которые указываются в SQL-операторе CREATE DATABASE.

18.3. Соединение с БД

Для соединения с БД необходимо выбрать элемент меню File \ Connect to Database и указать реквизиты базы данных (рис. 18.3).

Location Info - информация о расположении создаваемой БД. Local Server -данный компьютер; Remote Server - удаленный компьютер. В последнем случае необходимо указать имя сервера (поле Server) и сетевой протокол (поле Net Work Protocol).

Database Name - определяет имя создаваемой БД и полный путь к ней (поле Database). Далее необходимо ввести имя пользователя (поле User Name} и пароль (поле Password).

18.4. Выполнение SQL-операторов

После соединения с БД к ней можно адресовать запросы с помощью операторов SQL. В верхнем окне WISQL вводится SQL-оператор и для выполнения нажимается кнопка Run. Листать введенные SQL-операторы можно при помощи кнопок Previous и Next. В нижнем окне после выполнения оператора дублируется текст самого оператора и, в случае его правильности, показываются результаты выполнения запроса (рис. 18.4). Операторы могут завершаться точкой с запятой (при вводе операторов из WISQL это требование не является обязательным).

Могут выполняться все разрешенные SQL-операторы - от операторов определения метаданных (CREATE TABLE, CREATE PROCEDURE, DROP VIEW, DECLARE FUNCTION и т.д.) до непосредственно запросов к таблицам БД для чтения (SELECT) и изменения данных (INSERT, UPDATE, DELETE).

18.5. Подтверждение и откат изменений

При старте WISQL стартует неявная транзакция. Поэтому все запросы к БД в рамках сессии WISQL не актуализируются до выдачи подтверждения.

Подтверждение может выдаваться путем выполнения оператора COMMIT при выборе элемента меню File \ Commit Work. В последнем случае запрашивается подтверждение (рис. 18.5).

Подтверждение запрашивается также при разрыве соединения с БД (режим меню File \ Disconnect from Database) и при выходе из WISQL (режим меню File \ Exit).

При разрыве соединения с БД или при выходе из WISQL отказаться от изменений, произведенных в рамках текущей транзакции, можно при помощи оператора ROLLBACK путем выбора элемента меню File \ Rollback Work.

После подтверждения или отката транзакции неявно стартует новая транзакция. Явно запустить транзакцию можно, выполнив оператор SET TRANSACTION.

18.6. Просмотр структуры компонентов БД

Просмотр структуры компонентов БД (метаданных) осуществляется с помощью элемента меню View. Выбрав в выпадающем меню единственный элемент Metadata Information, можно затем указать компонент БД, информацию о котором необходимо получить(рис. 18.6).

Например, получим информацию о всех хранимых процедурах, объявленных в БД. Для этого в выпадающем списке выберем Procedure (поле View Information On), а поле Object Name оставим пустым (рис. 18.7) и нажмем кнопку Ok. В результате получим список хранимых процедур, объявленных в БД (рис. 18.8)

Ввод в поле Object Name имени конкретного компонента БД (в данном случае процедуры RASHOD_TOVARA) приведет к выводу тела процедуры и списка параметров (рис. 18.9).

18.7. Просмотр структуры БД

Полную структуру базы данных (все метаданные БД) можно получить, выбрав элемент меню Extract.

Выбор в выпадающем меню режима SQL Metadata for Database приведет к выдаче всех метаданных БД (в том виде, в котором их интерпретировал InterBase (рис. 18.10). Например, можно заметить, что внешние ключи, объявленные внутри оператора CREATE TABLE, преобразуются к ALTER TABLE...ADD FOREIGN KEY. Для получения данных за пределами окна воспользуйтесь полосой прокрутки. Перед выдачей метаданных поступит предложение сохранить их в файле на диске.

Выбор в выпадающем меню режима SQL Metadata for Table и выбор имени соответствующей таблицы приведут к выдаче метаданных по конкретной таблице. Перед выдачей метаданных поступит предложение сохранить их в файле на диске.

18.8. Установка режимов работы WISQL

Режимы работы текущей сессии WISQL можно определить, выбрав элемент меню Settings \ Basic Settings (рис. 18.11).

Auto Commit DDL определяет, следует ли автоматически завершать транзакцию для операторов языка определения данных (Data Definition Language), например, CREATE TABLE, DROP PROCEDURE и т.д. По умолчанию установлено автоматическое подтверждение операторов DDL.

Display Query Plan определяет, показывать или нет план выполнения запроса на чтение данных из БД, т.е. какие реальные индексы использует InterBase для выполнения операторов SELECT (рис. 18.12).

Display Statistics определяет, выводить или нет после каждого запроса системную информацию, например:

SELECT R.DAT_RASH,R.TOVAR, (R.KOLVO * Т.ZENA) AS STOIM FROM RASHOD R, TOVARY T

WHERE R.TOVAR = T.TOVAR

DAT_RASH TOVAR STOIM

10-JAN-1997 Сахар 80

10-JAN-1997 Сахар 2036

10-JAN-1997 Ставрида консерв. 15000

10-JAN-1997 Кока-кола 12000

20-JAN-1997 Сахар 120

20-JAN-1997 Кока-кола 60

20-JAN-1997 Кока-кола 3000

10-JAN-1997 Кока-кола 300

Current memory = 346112

Delta memory = -1024

Max memory = 352256

Elapsed time= 0.06 sec

Buffers = 256

Reads = 0

Writes 0

Fetches = 53

Display in List Formal определяет, включен ли показ данных в режиме списка, то есть показ записей не по горизонтали, а по вертикали:

SELECT R.DAT_RASH,R.TOVAR, (R.KOLVO * T.ZENA) AS STOIM

FROM RASHOD R, TOVARY T

WHERE R.TOVAR = T.TOVAR AND

R.KOLVO > 1000

DAT_RASH 10-JAN-1997

TOVAR Ставрида консерв.

STOIM 15000

DAT_RASH 10-JAN-1997

TOVAR Кока-кола

STOIM 12000

По умолчанию данный режим отключен.

Display Row Count включает и отключает показ счетчика строк при выдача результата запроса:

SELECT R.DAT_RASH,R.TOVAR, (R.KOLVO * T.ZENA) AS STOIM

FROM RASHOD R, TOVARY T

WHERE R.TOVAR = T.TOVAR AND

R.KOLVO > 1000

DAT_RASH TOVAR STOIM

10-JAN-1997 Ставрида консерв. 15000

10-JAN-1997 Кока-кола 12000

Records affected: 2

По умолчанию данный режим отключен.

Display Time Datatype включает и выключает режим показа времени в значениях типа DATE, где, как известно, хранятся дата и время одновременно:

SELECT R.DAT_RASH,R.TOVAR, (R.KOLVO * T.ZENA) AS STOIM

FROM RASHOD R, TOVARY T

WHERE R.TOVAR = T.TOVAR AND

R.KOLVO > 1000

DAT_RASH TOVAR STOIM

10-JAN-1997 00:00:00 Ставрида консерв. 15000

10-JAN-1997 00:00:00 Кока-кола 12000

По умолчанию данный режим отключен.

18.9. Выполнение Script-файлов

Текст SQL-запросов может быть оформлен в виде файла и затем выполнен (элемент меню File [ Run an ISQL Script}. Преимущество такого подхода очевидно в тех случаях, когда необходимо периодически выполнять повторяющиеся последовательности операторов. Операторы создания БД, таблиц, процедур, триггеров и т.д. также могут выполняться из отдельного Script-файла.

Для случая создания в Script-файле хранимых процедур и триггеров необходимо применять оператор

SET TERM НовыйРазделитель;

Необходимость его применения связана с тем, что стандартным разделителем SQL-операторов является точка с запятой ';'. В WISQL этот разделитель можно опускать, а вот в SQL-скрипте разделитель обязателен. Как известно, в теле хранимых процедур и триггеров операторы разделяются таким же разделителем:

CREATE PROCEDURE FIND_MAX_KOLVO (IN_TOVAR VARCHAR(20))

RETURNS(MAX_KOLVO INTEGER) AS

BEGIN

SELECT MAX(KOLVO)

FROM RASHOD

WHERE TOVAR = : IN_TOVAR

INTO : MAX_KOLVO;

SUSPEND;

END;

Поэтому перед выполнением оператора CREATE PROCEDURE или CREATE TRIGGER устанавливают новый разделитель, завершают им одно или несколько идущих подряд определений процедур и триггеров, а затем восстанавливают старый разделитель. Например,

SET TERM ### ;

CREATE PROCEDURE FIND_MAX_KOLVO (IN_TOVAR VARCHAR(20))

RETURNS(MAX_KOLVO INTEGER) AS

BEGIN

SELECT MAX(KOLVO)

FROM RASHOD

WHERE TOVAR = : IN_TOVAR

INTO : MAX_KOLVO;

SUSPEND;

END ###

SET TERM ; ###

При вводе и выполнении SQL-операторов непосредственно в окне WISQL, автоматически формируется последовательность операторов

SET TERM ^;

SET TERM ;^

Пример. Рассмотрим Script-файл 'CR_DB.SQL', осуществляющий создание БД и в ней нескольких таблиц, процедур и триггеров. Перед созданием БД ее старая версия уничтожается и выполняется оператор формата

SET NAMES НаборСимволов; а именно SET NAMES WIN1251;

Он аналогичен по действию установке набора символов WIN1251 в Session | Advanced Settings WISQL.

 

 

 

 

 

Содержимое Script-файла:

set names WIN1251;

connect "d:\book\ib_sklad\ib_sklad.gdb" USER "SYSDBA"

PASSWORD "masterkey";

drop database;

create database "d:\book\ib_sklad\ib_sklad.gdb" USER "SYSDBA"

PASSWORD "masterkey"

default character set WIN1251;

connect "d:\book\ib_sklad\ib_sklad.gdb" USER "SYSDBA"

PASSWORD "masterkey";

CREATE TABLE POKUPATELI(

POKUP VARCHAR(20) NOT NULL COLLATE PXW_CYRL,

GOROD VARCHAR(12) COLLATE PXW_CYRL,

ADRES VARCHAR(20) COLLATE PXW_CYRL,

PRIMARY KEY(POKUP)

);

CREATE TABLE TOVARY(

TOVAR VARCHAR(20) NOT NULL COLLATE PXW_CYRL,

ED_IZM VARCHAR(lO) NOT NULL COLLATE PXW_CYRL,

ZENA INTEGER NOT NULL,

PRIMARY KEY(TOVAR)

) ;

CREATE TABLE RASHOD(

N_RASH INTEGER NOT NULL,

DAT_RASH DATE NOT NULL,

KOLVO INTEGER NOT NULL,

TOVAR VARCHAR(20) NOT NULL COLLATE PXW_CYRL,

POKUP VARCHAR(20) COLLATE PXW_CYRL,

PRIMARY KEY(N_RASH),

FOREIGN KEY(POKUP) REFERENCES POKUPATELI,

FOREIGN KEY(TOVAR) REFERENCES TOVARY

);

SET TERM ###;

CREATE PROCEDURE FIND_MAX_KOLVO (IN_TOVAR VARCHAR(20))

RETURNS(MAX_KOLVO INTEGER) AS

BEGIN

SELECT MAX(KOLVO)

FROM RASHOD

WHERE TOVAR = : IN_TOVAR

INTO : MAX_KOLVO;

SUSPEND;

END ###

CREATE PROCEDURE POK_LIST (IN_TOVAR VARCHAR(20))

RETURNS(РОК VARCHAR(20)) AS

DECLARE VARIABLE AVG_KOLVO INTEGER;

BEGIN

SELECT AVG(KOLVO)

FROM RASHOD

WHERE TOVAR = :IN_TOVAR

INTO : AVG_KOLVO;

FOR SELECT POKUP

FROM RASHOD

WHERE KOLVO > : AVG_KOLVO

INTO : РОК

DO

BEGIN

IF (:POK IS NULL) THEN

РОК = "Покупатель не указан";

SUSPEND;

END

END ###

CREATE TABLE TOVARY_LOG(

DAT_IZM DATE,

DEISTV CHAR(3),

OLD_TOVAR VARCHAR(20),

NEW_TOVAR VARCHAR(20)

) ###

CREATE TRIGGER TOVARY_ADD_LOG FOR TOVARY

ACTIVE

AFTER INSERT

AS

BEGIN

INSERT INTO TOVARY_LOG(DAT_IZM, DEISTV, OLD_TOVAR,

NEW_TOVAR)

VALUES ("NOW","ADD","",NEW.TOVAR) ;

END ###

CREATE TRIGGER TOVARY_UPD_LOG FOR TOVARY

ACTIVE

AFTER UPDATE

AS

BEGIN

INSERT INTO TOVARY_LOG(DAT_IZM, DEISTV, OLD_TOVAR, NEW_TOVAR)

VALUES ("NOW","UPD",OLD.TOVAR,NEW.TOVAR) ;

END ###

CREATE TRIGGER TOVARY_DEL_LOG FOR TOVARY

ACTIVE

AFTER UPDATE

AS

BEGIN

INSERT INTO TOVARY_LOG(DAT_IZM, DEISTV, OLD_TOVAR, NEW_TOVAR)

VALUES ("NOW","DEL",OLD.TOVAR,"") ;

END ###

SET TERM ; ###

COMMIT;