Delphi 3 и создание приложений баз данных


Выполнение 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;



Содержание раздела