Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

EugeneBoss3



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

/******************************************************************************/
/***          Generated by IBExpert 2007.02.16 18.03.2007 17:29:26          ***/
/******************************************************************************/
 
SET SQL DIALECT 3;
 
SET NAMES WIN1251;
 
/**SET CLIENTLIB 'FBCLIENT.DLL';**/
 
CREATE DATABASE 'LOCALHOST:C:\Data\KLADR.FDB'
  USER 'SYSDBA'
  PASSWORD 'masterkey'
  PAGE_SIZE 8192
  DEFAULT CHARACTER SET WIN1251;
 
 
 
/******************************************************************************/
/***                                Domains                                 ***/
/******************************************************************************/
 
CREATE DOMAIN D_ADDRESS_ABBREV_ID AS
SMALLINT
NOT NULL;
 
CREATE DOMAIN D_ADDRESS_ABBREV_LEVEL AS
SMALLINT
NOT NULL
CHECK ((Value >= 1) and (Value <= 6));
 
CREATE DOMAIN D_ADDRESS_ABBREV_NAME AS
VARCHAR(40)
NOT NULL;
 
CREATE DOMAIN D_ADDRESS_ABBREV_POS AS
SMALLINT
DEFAULT 0
NOT NULL
CHECK ((Value >= 0) and (Value <= 2));
 
CREATE DOMAIN D_ADDRESS_ABBREV_POSA AS
SMALLINT
DEFAULT -1
NOT NULL
CHECK ((Value >= -1) and (Value <=2));
 
CREATE DOMAIN D_ADDRESS_ABBREV_SHNAME AS
VARCHAR(10)
NOT NULL;
 
CREATE DOMAIN D_ADDRESS_ACTUAL AS
SMALLINT
DEFAULT 0
NOT NULL
CHECK ((Value = 0) or (Value = 1));
 
CREATE DOMAIN D_ADDRESS_GNINMB AS
SMALLINT
DEFAULT 0
NOT NULL;
 
CREATE DOMAIN D_ADDRESS_ID AS
INTEGER
NOT NULL;
 
CREATE DOMAIN D_ADDRESS_INDEX AS
INTEGER
DEFAULT 0
NOT NULL
CHECK ((Value = 0) or (Value >= 100000 and Value <= 999999));
 
CREATE DOMAIN D_ADDRESS_LID AS
BIGINT
NOT NULL;
 
CREATE DOMAIN D_ADDRESS_NAME AS
VARCHAR(40)
NOT NULL;
 
CREATE DOMAIN D_ADDRESS_REGION AS
SMALLINT
NOT NULL
CHECK ((Value >= 0) and (Value < 100));
 
CREATE DOMAIN D_ADDRESS_STATUS AS
SMALLINT
DEFAULT 0
NOT NULL;
 
CREATE DOMAIN D_ADDRESS_UNO AS
SMALLINT
DEFAULT 0
NOT NULL;
 
CREATE DOMAIN D_ADDRESS_VERSION AS
SMALLINT
DEFAULT 0
NOT NULL;
 
CREATE DOMAIN D_OCATOREGION_ID AS
INTEGER
NOT NULL
CHECK ((Value >= 0) and (Value < 100));
 
CREATE DOMAIN D_OCATO_ID AS
INTEGER
NOT NULL
CHECK ((Value >= 0) and (Value < 1000));
 
 
 
/******************************************************************************/
/***                               Exceptions                               ***/
/******************************************************************************/
 
CREATE EXCEPTION EXC_MANYVALUES 'Список адресов превашает 100. Задайте более строгие критерии поиска.';
 
 
 
SET TERM ^ ;
 
 
 
/******************************************************************************/
/***                           Stored Procedures                            ***/
/******************************************************************************/
 
CREATE PROCEDURE GET_ADDRESS_LIST_2 (
    SRCH_STR VARCHAR(40),
    ADDRESS_TYPE SMALLINT,
    MAX_COUNT SMALLINT)
RETURNS (
    ADR_REG SMALLINT,
    ADR_ID BIGINT,
    ADR_FULLNAME VARCHAR(500))
AS
BEGIN
  EXIT;
END^
 
 
CREATE PROCEDURE GET_ADDRESS_LIST_20 (
    SRCH_STR VARCHAR(40),
    ADDRESS_TYPE SMALLINT,
    MAX_COUNT SMALLINT)
RETURNS (
    ADR_REG SMALLINT,
    ADR_ID BIGINT,
    ADR_VERS SMALLINT,
    ADR_FULLNAME VARCHAR(500))
AS
BEGIN
  EXIT;
END^
 
 
CREATE PROCEDURE GET_FULLADDRESS_2 (
    ADDRESS_TYPE SMALLINT,
    CR SMALLINT,
    CA BIGINT)
RETURNS (
    SA VARCHAR(500))
AS
BEGIN
  EXIT;
END^
 
 
CREATE PROCEDURE GET_FULLADDRESS_20 (
    ADDRESS_TYPE SMALLINT,
    CR SMALLINT,
    CA BIGINT,
    CV SMALLINT)
RETURNS (
    SA VARCHAR(500))
AS
BEGIN
  EXIT;
END^
 
 
CREATE PROCEDURE GET_REGION_LIST (
    TYPEBASE SMALLINT)
RETURNS (
    ADDRESSREGION_ID SMALLINT,
    ADDRESS_NAME VARCHAR(100))
AS
BEGIN
  EXIT;
END^
 
 
 
SET TERM ; ^
 
 
/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/
 
 
 
CREATE TABLE KLADR_ABBREV (
    ABBREV_LEVEL   D_ADDRESS_ABBREV_LEVEL NOT NULL,
    ABBREV_ID      D_ADDRESS_ABBREV_ID NOT NULL,
    ABBREV_POS     D_ADDRESS_ABBREV_POS,
    ABBREV_NAME    D_ADDRESS_ABBREV_NAME,
    ABBREV_SHNAME  D_ADDRESS_ABBREV_SHNAME
);
 
CREATE TABLE KLADR_ADDRESS_2 (
    ADDRESSREGION_ID  D_ADDRESS_REGION NOT NULL,
    ADDRESS_ID        D_ADDRESS_LID NOT NULL,
    ADDRESS_PAR       D_ADDRESS_LID,
    ADDRESS_NAME      D_ADDRESS_NAME,
    ABBREV_LEVEL      D_ADDRESS_ABBREV_LEVEL,
    ABBREV_ID         D_ADDRESS_ABBREV_ID,
    ABBREV_POS        D_ADDRESS_ABBREV_POSA,
    ADDRESS_UNO       D_ADDRESS_UNO,
    ADDRESS_GNINMB    D_ADDRESS_GNINMB,
    ADDRESS_STATUS    D_ADDRESS_STATUS,
    ADDRESS_INDEX     D_ADDRESS_INDEX,
    OCATOREGION_ID    D_OCATOREGION_ID,
    OCATO1_ID         D_OCATO_ID,
    OCATO2_ID         D_OCATO_ID,
    OCATO3_ID         D_OCATO_ID
);
 
CREATE TABLE KLADR_ADDRESS_20 (
    ADDRESSREGION_ID  D_ADDRESS_REGION NOT NULL,
    ADDRESS_ID        D_ADDRESS_LID NOT NULL,
    ADDRESS_VERSION   D_ADDRESS_VERSION,
    ADDRESS_ACTUAL    D_ADDRESS_ACTUAL,
    ADDRESS_NAME      D_ADDRESS_NAME,
    ABBREV_LEVEL      D_ADDRESS_ABBREV_LEVEL,
    ABBREV_ID         D_ADDRESS_ABBREV_ID,
    ABBREV_POS        D_ADDRESS_ABBREV_POSA,
    ADDRESS_UNO       D_ADDRESS_UNO,
    ADDRESS_GNINMB    D_ADDRESS_GNINMB,
    ADDRESS_STATUS    D_ADDRESS_STATUS,
    ADDRESS_INDEX     D_ADDRESS_INDEX,
    OCATOREGION_ID    D_OCATOREGION_ID,
    OCATO1_ID         D_OCATO_ID,
    OCATO2_ID         D_OCATO_ID,
    OCATO3_ID         D_OCATO_ID
);
 
CREATE TABLE KLADR_ADDRESS_20_DEPEND (
    ADDRESSREGION_ID  D_ADDRESS_REGION,
    ADDRESS_ID        D_ADDRESS_LID,
    ADDRESS_VERSION   D_ADDRESS_VERSION,
    ADDRESS_PAR       D_ADDRESS_LID,
    ADDRESS_PARVERS   D_ADDRESS_VERSION
);
 
 
 
/******************************************************************************/
/***                                 Views                                  ***/
/******************************************************************************/
 
 
/* View: VW_ADDRESS_2 */
CREATE VIEW VW_ADDRESS_2(
    ADDRESSREGION_ID,
    ADDRESS_ID,
    ADDRESS_PAR,
    ADDRESS_NAME,
    ABBREV_LEVEL,
    ABBREV_ID,
    ABBREV_POS,
    ADDRESS_UNO,
    ADDRESS_GNINMB,
    ADDRESS_STATUS,
    ADDRESS_INDEX,
    OCATOREGION_ID,
    OCATO1_ID,
    OCATO2_ID,
    OCATO3_ID,
    ABBREV_MAINPOS,
    ABBREV_NAME,
    ABBREV_SHNAME,
    ADDRESS_VERSION,
    ADDRESS_PARVERS,
    ADDRESS_ACTUAL)
AS
select
    K.ADDRESSREGION_ID, K.ADDRESS_ID, K.ADDRESS_PAR, K.ADDRESS_NAME,
    K.ABBREV_LEVEL, K.ABBREV_ID, K.ABBREV_POS, K.ADDRESS_UNO, K.ADDRESS_GNINMB,
    K.ADDRESS_STATUS, K.ADDRESS_INDEX,
    K.OCATOREGION_ID, K.OCATO1_ID, K.OCATO2_ID, K.OCATO3_ID,
    S.ABBREV_POS, S.ABBREV_NAME, S.ABBREV_SHNAME, 0, 0, 0
  from KLADR_ADDRESS_2 K
  left join KLADR_ABBREV S on ((S.ABBREV_LEVEL = K.ABBREV_LEVEL) and (S.ABBREV_ID = K.ABBREV_ID))
  where (ADDRESS_ID > 0) and (K.ABBREV_LEVEL < 5)
;
 
 
 
/* View: VW_ADDRESS_20 */
CREATE VIEW VW_ADDRESS_20(
    ADDRESSREGION_ID,
    ADDRESS_ID,
    ADDRESS_VERSION,
    ADDRESS_ACTUAL,
    ADDRESS_NAME,
    ABBREV_LEVEL,
    ABBREV_ID,
    ABBREV_POS,
    ADDRESS_UNO,
    ADDRESS_GNINMB,
    ADDRESS_STATUS,
    ADDRESS_INDEX,
    OCATOREGION_ID,
    OCATO1_ID,
    OCATO2_ID,
    OCATO3_ID,
    ADDRESS_PAR,
    ADDRESS_PARVERS,
    ABBREV_MAINPOS,
    ABBREV_NAME,
    ABBREV_SHNAME)
AS
select
   K.ADDRESSREGION_ID, K.ADDRESS_ID, K.ADDRESS_VERSION, K.ADDRESS_ACTUAL,
   K.ADDRESS_NAME, K.ABBREV_LEVEL, K.ABBREV_ID, K.ABBREV_POS, K.ADDRESS_UNO,
   K.ADDRESS_GNINMB, K.ADDRESS_STATUS, K.ADDRESS_INDEX,
   K.OCATOREGION_ID, K.OCATO1_ID, K.OCATO2_ID, K.OCATO3_ID,
   D.ADDRESS_PAR, D.ADDRESS_PARVERS,
   S.ABBREV_POS, S.ABBREV_NAME, S.ABBREV_SHNAME
  from KLADR_ADDRESS_20 K
  left join KLADR_ADDRESS_20_DEPEND D on
  (K.ADDRESSREGION_ID = D.ADDRESSREGION_ID and K.ADDRESS_ID = D.ADDRESS_ID and K.ADDRESS_VERSION = D.ADDRESS_VERSION)
  left join KLADR_ABBREV S on ((S.ABBREV_LEVEL = K.ABBREV_LEVEL) and (S.ABBREV_ID = K.ABBREV_ID))
  where (K.ABBREV_LEVEL < 5) and (D.ADDRESS_ID > 0)
;
 
 
 
/* View: VW_REGIONS_2 */
CREATE VIEW VW_REGIONS_2(
    ADDRESSREGION_ID,
    ADDRESS_ID,
    ADDRESS_PAR,
    ADDRESS_NAME,
    ABBREV_LEVEL,
    ABBREV_ID,
    ABBREV_POS,
    ADDRESS_UNO,
    ADDRESS_GNINMB,
    ADDRESS_STATUS,
    ADDRESS_INDEX,
    OCATOREGION_ID,
    OCATO1_ID,
    OCATO2_ID,
    OCATO3_ID,
    ABBREV_MAINPOS,
    ABBREV_NAME,
    ABBREV_SHNAME,
    ADDRESS_VERSION,
    ADDRESS_PARVERS,
    ADDRESS_ACTUAL)
AS
select
    K.ADDRESSREGION_ID, K.ADDRESS_ID, K.ADDRESS_PAR, K.ADDRESS_NAME,
    K.ABBREV_LEVEL, K.ABBREV_ID, K.ABBREV_POS, K.ADDRESS_UNO, K.ADDRESS_GNINMB,
    K.ADDRESS_STATUS, K.ADDRESS_INDEX,
    K.OCATOREGION_ID, K.OCATO1_ID, K.OCATO2_ID, K.OCATO3_ID,
    S.ABBREV_POS, S.ABBREV_NAME, S.ABBREV_SHNAME, 0, 0, 0
  from KLADR_ADDRESS_2 K
  left join KLADR_ABBREV S on ((S.ABBREV_LEVEL = K.ABBREV_LEVEL) and (S.ABBREV_ID = K.ABBREV_ID))
  where K.ADDRESS_ID = 0 and K.ABBREV_LEVEL = 1
;
 
 
 
/* View: VW_REGIONS_20 */
CREATE VIEW VW_REGIONS_20(
    ADDRESSREGION_ID,
    ADDRESS_ID,
    ADDRESS_VERSION,
    ADDRESS_ACTUAL,
    ADDRESS_NAME,
    ABBREV_LEVEL,
    ABBREV_ID,
    ABBREV_POS,
    ADDRESS_UNO,
    ADDRESS_GNINMB,
    ADDRESS_STATUS,
    ADDRESS_INDEX,
    OCATOREGION_ID,
    OCATO1_ID,
    OCATO2_ID,
    OCATO3_ID,
    ADDRESS_PAR,
    ADDRESS_PARVERS,
    ABBREV_MAINPOS,
    ABBREV_NAME,
    ABBREV_SHNAME)
AS
select
   K.ADDRESSREGION_ID, K.ADDRESS_ID, K.ADDRESS_VERSION, K.ADDRESS_ACTUAL,
   K.ADDRESS_NAME, K.ABBREV_LEVEL, K.ABBREV_ID, K.ABBREV_POS, K.ADDRESS_UNO,
   K.ADDRESS_GNINMB, K.ADDRESS_STATUS, K.ADDRESS_INDEX,
   K.OCATOREGION_ID, K.OCATO1_ID, K.OCATO2_ID, K.OCATO3_ID,
   D.ADDRESS_PAR, D.ADDRESS_PARVERS,
   S.ABBREV_POS, S.ABBREV_NAME, S.ABBREV_SHNAME
  from KLADR_ADDRESS_20 K
  left join KLADR_ADDRESS_20_DEPEND D on
  (K.ADDRESSREGION_ID = D.ADDRESSREGION_ID and K.ADDRESS_ID = D.ADDRESS_ID and K.ADDRESS_VERSION = D.ADDRESS_VERSION)
  left join KLADR_ABBREV S on ((S.ABBREV_LEVEL = K.ABBREV_LEVEL) and (S.ABBREV_ID = K.ABBREV_ID))
where K.ADDRESS_ID = 0  and K.ABBREV_LEVEL = 1
;
 
 
 
/* View: VW_STREET_2 */
CREATE VIEW VW_STREET_2(
    ADDRESSREGION_ID,
    ADDRESS_ID,
    ADDRESS_PAR,
    ADDRESS_NAME,
    ABBREV_LEVEL,
    ABBREV_ID,
    ABBREV_POS,
    ADDRESS_UNO,
    ADDRESS_GNINMB,
    ADDRESS_STATUS,
    ADDRESS_INDEX,
    OCATOREGION_ID,
    OCATO1_ID,
    OCATO2_ID,
    OCATO3_ID,
    ABBREV_MAINPOS,
    ABBREV_NAME,
    ABBREV_SHNAME,
    ADDRESS_VERSION,
    ADDRESS_PARVERS,
    ADDRESS_ACTUAL)
AS
select
    K.ADDRESSREGION_ID, K.ADDRESS_ID, K.ADDRESS_PAR, K.ADDRESS_NAME,
    K.ABBREV_LEVEL, K.ABBREV_ID, K.ABBREV_POS, K.ADDRESS_UNO, K.ADDRESS_GNINMB,
    K.ADDRESS_STATUS, K.ADDRESS_INDEX,
    K.OCATOREGION_ID, K.OCATO1_ID, K.OCATO2_ID, K.OCATO3_ID,
    S.ABBREV_POS, S.ABBREV_NAME, S.ABBREV_SHNAME, 0, 0, 0
  from KLADR_ADDRESS_2 K
  left join KLADR_ABBREV S on ((S.ABBREV_LEVEL = K.ABBREV_LEVEL) and (S.ABBREV_ID = K.ABBREV_ID))
  where (K.ABBREV_LEVEL = 5)
;
 
 
 
/* View: VW_STREET_20 */
CREATE VIEW VW_STREET_20(
    ADDRESSREGION_ID,
    ADDRESS_ID,
    ADDRESS_VERSION,
    ADDRESS_ACTUAL,
    ADDRESS_NAME,
    ABBREV_LEVEL,
    ABBREV_ID,
    ABBREV_POS,
    ADDRESS_UNO,
    ADDRESS_GNINMB,
    ADDRESS_STATUS,
    ADDRESS_INDEX,
    OCATOREGION_ID,
    OCATO1_ID,
    OCATO2_ID,
    OCATO3_ID,
    ADDRESS_PAR,
    ADDRESS_PARVERS,
    ABBREV_MAINPOS,
    ABBREV_NAME,
    ABBREV_SHNAME)
AS
select
   K.ADDRESSREGION_ID, K.ADDRESS_ID, K.ADDRESS_VERSION, K.ADDRESS_ACTUAL,
   K.ADDRESS_NAME, K.ABBREV_LEVEL, K.ABBREV_ID, K.ABBREV_POS, K.ADDRESS_UNO,
   K.ADDRESS_GNINMB, K.ADDRESS_STATUS, K.ADDRESS_INDEX,
   K.OCATOREGION_ID, K.OCATO1_ID, K.OCATO2_ID, K.OCATO3_ID,
   D.ADDRESS_PAR, D.ADDRESS_PARVERS,
   S.ABBREV_POS, S.ABBREV_NAME, S.ABBREV_SHNAME
  from KLADR_ADDRESS_20 K
  left join KLADR_ADDRESS_20_DEPEND D on
  (K.ADDRESSREGION_ID = D.ADDRESSREGION_ID and K.ADDRESS_ID = D.ADDRESS_ID and K.ADDRESS_VERSION = D.ADDRESS_VERSION)
  left join KLADR_ABBREV S on ((S.ABBREV_LEVEL = K.ABBREV_LEVEL) and (S.ABBREV_ID = K.ABBREV_ID))
  where  (K.ABBREV_LEVEL = 5)
;
 
 
 
 
/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/
 
ALTER TABLE KLADR_ABBREV ADD CONSTRAINT PK_KLADR_ABBREV PRIMARY KEY (ABBREV_LEVEL, ABBREV_ID);
ALTER TABLE KLADR_ADDRESS_2 ADD CONSTRAINT PK_KLADR_ADDRESS_2 PRIMARY KEY (ADDRESSREGION_ID, ADDRESS_ID);
ALTER TABLE KLADR_ADDRESS_20 ADD CONSTRAINT PK_KLADR_ADDRESS_20 PRIMARY KEY (ADDRESSREGION_ID, ADDRESS_ID, ADDRESS_VERSION);
ALTER TABLE KLADR_ADDRESS_20_DEPEND ADD CONSTRAINT PK_KLADR_ADDRESS_20_DEPEND PRIMARY KEY (ADDRESSREGION_ID, ADDRESS_ID, ADDRESS_VERSION);
 
 
/******************************************************************************/
/***                              Foreign Keys                              ***/
/******************************************************************************/
 
ALTER TABLE KLADR_ADDRESS_2 ADD CONSTRAINT FK_KLADR_ADDRESS_2_1 FOREIGN KEY (ABBREV_LEVEL, ABBREV_ID) REFERENCES KLADR_ABBREV (ABBREV_LEVEL, ABBREV_ID);
ALTER TABLE KLADR_ADDRESS_2 ADD CONSTRAINT FK_KLADR_ADDRESS_2_2 FOREIGN KEY (ADDRESSREGION_ID, ADDRESS_PAR) REFERENCES KLADR_ADDRESS_2 (ADDRESSREGION_ID, ADDRESS_ID);
ALTER TABLE KLADR_ADDRESS_20 ADD CONSTRAINT FK_KLADR_ADDRESS_20_1 FOREIGN KEY (ABBREV_LEVEL, ABBREV_ID) REFERENCES KLADR_ABBREV (ABBREV_LEVEL, ABBREV_ID);
ALTER TABLE KLADR_ADDRESS_20_DEPEND ADD CONSTRAINT FK_KLADR_ADDRESS_20_DEPEND_1 FOREIGN KEY (ADDRESSREGION_ID, ADDRESS_ID, ADDRESS_VERSION) REFERENCES KLADR_ADDRESS_20 (ADDRESSREGION_ID, ADDRESS_ID, ADDRESS_VERSION);
ALTER TABLE KLADR_ADDRESS_20_DEPEND ADD CONSTRAINT FK_KLADR_ADDRESS_20_DEPEND_2 FOREIGN KEY (ADDRESSREGION_ID, ADDRESS_PAR, ADDRESS_PARVERS) REFERENCES KLADR_ADDRESS_20 (ADDRESSREGION_ID, ADDRESS_ID, ADDRESS_VERSION);
 
 
/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/
 
CREATE INDEX KLADR_ADDRESS_2_IDX_1 ON KLADR_ADDRESS_2 (ADDRESSREGION_ID, ADDRESS_ID, ABBREV_LEVEL);
CREATE INDEX KLADR_ADDRESS_2_IDX_2 ON KLADR_ADDRESS_2 (ADDRESSREGION_ID, ADDRESS_PAR, ABBREV_LEVEL);
 
 
/******************************************************************************/
/***                           Stored Procedures                            ***/
/******************************************************************************/
 
 
SET TERM ^ ;
 
ALTER PROCEDURE GET_ADDRESS_LIST_2 (
    SRCH_STR VARCHAR(40),
    ADDRESS_TYPE SMALLINT,
    MAX_COUNT SMALLINT)
RETURNS (
    ADR_REG SMALLINT,
    ADR_ID BIGINT,
    ADR_FULLNAME VARCHAR(500))
AS
DECLARE VARIABLE CNT SMALLINT;
BEGIN
  IF (:ADDRESS_TYPE IS NULL) THEN ADDRESS_TYPE = 0;
  IF (MAX_COUNT IS NULL) THEN MAX_COUNT = 100;
  IF ((:MAX_COUNT > 100) OR (:MAX_COUNT < 5)) THEN MAX_COUNT = 100;
  CNT = 0;
  FOR
    SELECT A.ADDRESSREGION_ID, A.ADDRESS_ID
    FROM KLADR_ADDRESS_2 A
    WHERE (A.ABBREV_LEVEL < 5) AND UPPER(A.ADDRESS_NAME) LIKE :SRCH_STR
    ORDER BY A.ADDRESSREGION_ID
    INTO :ADR_REG, :ADR_ID
  DO BEGIN
    SELECT SA FROM GET_FULLADDRESS_2(:ADDRESS_TYPE, :ADR_REG, :ADR_ID)
    INTO :ADR_FULLNAME;
    SUSPEND;
    CNT = :CNT + 1;
    IF (:CNT > :MAX_COUNT) THEN EXCEPTION EXC_MANYVALUES;
  END
  SUSPEND;
END
^
 
ALTER PROCEDURE GET_ADDRESS_LIST_20 (
    SRCH_STR VARCHAR(40),
    ADDRESS_TYPE SMALLINT,
    MAX_COUNT SMALLINT)
RETURNS (
    ADR_REG SMALLINT,
    ADR_ID BIGINT,
    ADR_VERS SMALLINT,
    ADR_FULLNAME VARCHAR(500))
AS
DECLARE VARIABLE CNT SMALLINT;
BEGIN
  IF (:ADDRESS_TYPE IS NULL) THEN ADDRESS_TYPE = 0;
  IF (MAX_COUNT IS NULL) THEN MAX_COUNT = 100;
  IF ((:MAX_COUNT > 100) OR (:MAX_COUNT < 5)) THEN MAX_COUNT = 100;
  CNT = 0;
  FOR
    SELECT A.ADDRESSREGION_ID, A.ADDRESS_ID, A.ADDRESS_VERSION
    FROM KLADR_ADDRESS_20 A
    WHERE (A.ABBREV_LEVEL < 5) AND UPPER(A.ADDRESS_NAME) LIKE :SRCH_STR
    ORDER BY A.ADDRESSREGION_ID
    INTO :ADR_REG, :ADR_ID, :ADR_VERS
  DO BEGIN
    SELECT SA FROM GET_FULLADDRESS_20(:ADDRESS_TYPE, :ADR_REG, :ADR_ID, :ADR_VERS)
    INTO :ADR_FULLNAME;
    SUSPEND;
    CNT = :CNT + 1;
    IF (:CNT > :MAX_COUNT) THEN EXCEPTION EXC_MANYVALUES;
  END
  SUSPEND;
END
^
 
ALTER PROCEDURE GET_FULLADDRESS_2 (
    ADDRESS_TYPE SMALLINT,
    CR SMALLINT,
    CA BIGINT)
RETURNS (
    SA VARCHAR(500))
AS
DECLARE VARIABLE NOA BIGINT;
DECLARE VARIABLE NOP BIGINT;
DECLARE VARIABLE NOL INTEGER;
DECLARE VARIABLE NO3 INTEGER;
DECLARE VARIABLE SPINDEX INTEGER;
DECLARE VARIABLE SPINDEX1 INTEGER;
DECLARE VARIABLE MPOS SMALLINT;
DECLARE VARIABLE OPOS SMALLINT;
DECLARE VARIABLE SP1 VARCHAR(40) CHARACTER SET WIN1251;
DECLARE VARIABLE SP2 VARCHAR(40) CHARACTER SET WIN1251;
DECLARE VARIABLE SFX VARCHAR(2);
BEGIN
  SA = '';
  SPINDEX = 0;
  NOA = CA;
  NO3 = 5;
  IF (:ADDRESS_TYPE IS NULL) THEN ADDRESS_TYPE = 0;
  IF (ADDRESS_TYPE = 0) THEN SFX = ', ';
  ELSE SFX = ',';
  /* ПОСТРОЕНИЕ СТРОКИ АДРЕСА */
  WHILE (NOA >= 0) DO
  BEGIN
    /* ДЛЯ НАЛОГОВОГО СЛУЧАЯ НАЗВАНИЯ РЕГИОНА НЕ ВЫЧИСЛЯЕТСЯ. ВЫХОДИМ */
    IF ((ADDRESS_TYPE > 0) AND (NOA = 0)) THEN LEAVE;
    NOP = -1;
    FOR
      SELECT A.ADDRESS_NAME, A.ADDRESS_PAR,
        A.ABBREV_LEVEL, A.ABBREV_POS, A.ADDRESS_INDEX, B.ABBREV_SHNAME, B.ABBREV_POS
      FROM KLADR_ADDRESS_2 A
      LEFT JOIN KLADR_ABBREV B ON (B.ABBREV_LEVEL = A.ABBREV_LEVEL AND B.ABBREV_ID = A.ABBREV_ID)
      WHERE (A.ADDRESSREGION_ID = :CR) AND (A.ADDRESS_ID = :NOA)
      INTO :SP1, :NOP, :NOL, POS, :SPINDEX1, :SP2, :MPOS
    DO BEGIN
      IF ((SPINDEX = 0) AND (SPINDEX1 <> 0)) THEN SPINDEX = SPINDEX1;
      IF (ADDRESS_TYPE = 0) THEN
      BEGIN
        IF (:OPOS < 0) THEN OPOS = MPOS;
        IF (:OPOS = 0) THEN SA = SP2 || ' ' || SP1 || SFX || SA;
        ELSE
          IF (:OPOS = 1) THEN SA = SP1 || ' ' || SP2 || SFX || SA;
          ELSE SA = SP1 || SFX || SA;
      END ELSE BEGIN
        NOA = NOP;
        WHILE (NO3 > NOL) DO
        BEGIN
          NO3 = NO3 - 1;
          SA = SFX || SA;
        END
        SA = SP1 || ' ' || SP2 || SFX || SA;
        NO3 = NO3 - 1;
      END
    END
    IF ((NOA = 0) AND (NOP = 0)) THEN LEAVE;
    NOA = NOP;
  END
  IF (ADDRESS_TYPE = 0) THEN
  BEGIN
    IF (:SPINDEX > 0) THEN SA = SPINDEX || SFX || SA;
  END ELSE BEGIN
    WHILE (NO3 > 1) DO
    BEGIN
      SA = SFX || SA;
      NO3 = NO3 - 1;
    END
    IF (CR < 10) THEN SA = '0' || CR || SFX || SA;
    ELSE SA = CR || SFX || SA;
    IF (:SPINDEX <> 0) THEN SA = SFX || SPINDEX || SFX || SA;
    ELSE SA = SFX || SFX || SA;
  END
  SUSPEND;
END
^
 
ALTER PROCEDURE GET_FULLADDRESS_20 (
    ADDRESS_TYPE SMALLINT,
    CR SMALLINT,
    CA BIGINT,
    CV SMALLINT)
RETURNS (
    SA VARCHAR(500))
AS
DECLARE VARIABLE NOA BIGINT;
DECLARE VARIABLE NOP BIGINT;
DECLARE VARIABLE NOV INTEGER;
DECLARE VARIABLE NOL INTEGER;
DECLARE VARIABLE NO3 INTEGER;
DECLARE VARIABLE SPINDEX INTEGER;
DECLARE VARIABLE SPINDEX1 INTEGER;
DECLARE VARIABLE MPOS SMALLINT;
DECLARE VARIABLE OPOS SMALLINT;
DECLARE VARIABLE SP1 VARCHAR(40) CHARACTER SET WIN1251;
DECLARE VARIABLE SP2 VARCHAR(40) CHARACTER SET WIN1251;
DECLARE VARIABLE SFX VARCHAR(2);
BEGIN
  SA = '';
  SPINDEX = 0;
  NOA = CA;
  NOV = CV;
  NO3 = 5;
  IF (:ADDRESS_TYPE IS NULL) THEN ADDRESS_TYPE = 0;
  IF (ADDRESS_TYPE = 0) THEN SFX = ', ';
  ELSE SFX = ',';
  /* ПОСТРОЕНИЕ СТРОКИ АДРЕСА */
  WHILE (NOA >= 0) DO
  BEGIN
    /* ДЛЯ НАЛОГОВОГО СЛУЧАЯ НАЗВАНИЯ РЕГИОНА НЕ ВЫЧИСЛЯЕТСЯ. ВЫХОДИМ */
    IF ((ADDRESS_TYPE > 0) AND (NOA = 0)) THEN LEAVE;
    NOP = -1;
    FOR
      SELECT A.ADDRESS_NAME, D.ADDRESS_PAR, D.ADDRESS_PARVERS,
        A.ABBREV_LEVEL, A.ABBREV_POS, A.ADDRESS_INDEX, B.ABBREV_SHNAME, B.ABBREV_POS
      FROM KLADR_ADDRESS_20 A
      LEFT JOIN KLADR_ABBREV B ON (B.ABBREV_LEVEL = A.ABBREV_LEVEL AND B.ABBREV_ID = A.ABBREV_ID)
      LEFT JOIN KLADR_ADDRESS_20_DEPEND D ON (
        D.ADDRESSREGION_ID = A.ADDRESSREGION_ID AND
        D.ADDRESS_ID = A.ADDRESS_ID AND
        D.ADDRESS_VERSION = A.ADDRESS_VERSION)
      WHERE (A.ADDRESSREGION_ID = :CR) AND (A.ADDRESS_ID = :NOA) AND (A.ADDRESS_VERSION = :NOV)
      INTO :SP1, :NOP, :NOV, :NOL, POS, :SPINDEX1, :SP2, :MPOS
    DO BEGIN
      IF ((SPINDEX = 0) AND (SPINDEX1 <> 0)) THEN SPINDEX = SPINDEX1;
      IF (ADDRESS_TYPE = 0) THEN
      BEGIN
        IF (:OPOS < 0) THEN OPOS = MPOS;
        IF (:OPOS = 0) THEN SA = SP2 || ' ' || SP1 || SFX || SA;
        ELSE
          IF (:OPOS = 1) THEN SA = SP1 || ' ' || SP2 || SFX || SA;
          ELSE SA = SP1 || SFX || SA;
      END ELSE BEGIN
        NOA = NOP;
        WHILE (NO3 > NOL) DO
        BEGIN
          NO3 = NO3 - 1;
          SA = SFX || SA;
        END
        SA = SP1 || ' ' || SP2 || SFX || SA;
        NO3 = NO3 - 1;
      END
    END
    IF ((NOA = 0) AND (NOP = 0)) THEN LEAVE;
    NOA = NOP;
  END
  --
  IF (ADDRESS_TYPE = 0) THEN
  BEGIN
    IF (:SPINDEX > 0) THEN SA = SPINDEX || SFX || SA;
  END ELSE BEGIN
    WHILE (NO3 > 1) DO
    BEGIN
      SA = SFX || SA;
      NO3 = NO3 - 1;
    END
    IF (CR < 10) THEN SA = '0' || CR || SFX || SA;
    ELSE SA = CR || SFX || SA;
    IF (:SPINDEX <> 0) THEN SA = SFX || SPINDEX || SFX || SA;
    ELSE SA = SFX || SFX || SA;
  END
  SUSPEND;
END
^
 
ALTER PROCEDURE GET_REGION_LIST (
    TYPEBASE SMALLINT)
RETURNS (
    ADDRESSREGION_ID SMALLINT,
    ADDRESS_NAME VARCHAR(100))
AS
DECLARE VARIABLE POSORIG INTEGER;
DECLARE VARIABLE POSMAIN INTEGER;
DECLARE VARIABLE ADRNAME VARCHAR(40);
DECLARE VARIABLE ABBRNAME VARCHAR(10);
BEGIN
  IF (:TYPEBASE = 0) THEN
  BEGIN
    FOR
      SELECT A.ADDRESSREGION_ID, A.ADDRESS_NAME, A.ABBREV_POS, A.ABBREV_MAINPOS, A.ABBREV_SHNAME
      FROM VW_REGIONS_2 A
      ORDER BY A.ADDRESSREGION_ID
      INTO :ADDRESSREGION_ID, :ADRNAME, OSORIG, OSMAIN, :ABBRNAME
    DO BEGIN
      IF (:ADDRESSREGION_ID < 10) THEN ADDRESS_NAME = '[0' || :ADDRESSREGION_ID || '] ';
      ELSE ADDRESS_NAME = '[' || :ADDRESSREGION_ID || '] ';
      IF (:POSORIG < 0) THEN POSORIG = OSMAIN;
      IF (:POSORIG = 0) THEN ADDRESS_NAME = :ADDRESS_NAME || :ABBRNAME || ' ' || :ADRNAME;
      ELSE
        IF (:POSORIG = 1) THEN ADDRESS_NAME = :ADDRESS_NAME || :ADRNAME || ' ' || :ABBRNAME;
        ELSE ADDRESS_NAME = :ADDRESS_NAME || :ADRNAME;
      SUSPEND;
    END
  END ELSE BEGIN
    FOR
      SELECT A.ADDRESSREGION_ID, A.ADDRESS_NAME, A.ABBREV_POS, A.ABBREV_MAINPOS, A.ABBREV_SHNAME
      FROM VW_REGIONS_20 A
      ORDER BY A.ADDRESSREGION_ID
      INTO :ADDRESSREGION_ID, :ADRNAME, OSORIG, OSMAIN, :ABBRNAME
    DO BEGIN
      IF (:ADDRESSREGION_ID < 10) THEN ADDRESS_NAME = '[0' || :ADDRESSREGION_ID || '] ';
      ELSE ADDRESS_NAME = '[' || :ADDRESSREGION_ID || '] ';
      IF (:POSORIG < 0) THEN POSORIG = OSMAIN;
      IF (:POSORIG = 0) THEN ADDRESS_NAME = :ADDRESS_NAME || :ABBRNAME || ' ' || :ADRNAME;
      ELSE
        IF (:POSORIG = 1) THEN ADDRESS_NAME = :ADDRESS_NAME || :ADRNAME || ' ' || :ABBRNAME;
        ELSE ADDRESS_NAME = :ADDRESS_NAME || :ADRNAME;
      SUSPEND;
    END
  END
END
^
 
 
SET TERM ; ^
 

Всего записей: 247 | Зарегистр. 15-09-2009 | Отправлено: 01:25 22-04-2010
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru