Firebird Embedded глюк!

NT Man
Дата: 23.10.2005 21:08:35
Пишу вот такой запрос:
SELECT
  PERSON.*,
  (select PERENUM.NLSOLD from perenum where  PERSON.NLS=PERENUM.NLSNEW)
FROM
 PERSON
На Firebird 1.5.2.4731 Win32 вся работает пучком, а на Firebird 1.5.2.4731 embedded win32 не работает нифига.
Ктонибудь разъясните в чём дело. Может я чего не так делаю?
Kull Damned
Дата: 23.10.2005 21:42:11
Учи JOIN, такой запрос зависит от данных, как только в таблице PERENUM появится две записи с одинаковым значением в поле NLSNEW - так и настанет кирдык. Вообще правильные пацаны всегда сообщают текст ошибки, но перед тем как спросить - медитируют над её текстом...

Posted via ActualForum NNTP Server 1.3

NT Man
Дата: 23.10.2005 21:53:08
Наверное надо было превести код создания таблиц:

CREATE TABLE PERSON (
    ID INTEGER,
    STATE SMALLINT,
    SDATE DATE,
    CEH INTEGER,
    F VARCHAR (20) CHARACTER SET WIN1251 COLLATE WIN1251,
    I VARCHAR (20) CHARACTER SET WIN1251 COLLATE WIN1251,
    O VARCHAR (20) CHARACTER SET WIN1251 COLLATE WIN1251,
    NLS VARCHAR (20) CHARACTER SET WIN1251 COLLATE WIN1251,
    NCARD VARCHAR (18) CHARACTER SET WIN1251 COLLATE WIN1251,
    S_PASS VARCHAR (8) CHARACTER SET WIN1251 COLLATE WIN1251,
    N_PASS VARCHAR (20) CHARACTER SET WIN1251 COLLATE WIN1251,
    W_PASS VARCHAR (45) CHARACTER SET WIN1251 COLLATE WIN1251,
    D_PASS DATE,
    P_INDEX VARCHAR (6) CHARACTER SET WIN1251 COLLATE WIN1251,
    REGION VARCHAR (35) CHARACTER SET WIN1251 COLLATE WIN1251,
    NPUNKT VARCHAR (20) CHARACTER SET WIN1251 COLLATE WIN1251,
    NPUNKTTYPE INTEGER,
    RAYON VARCHAR (30) CHARACTER SET WIN1251 COLLATE WIN1251,
    STREET VARCHAR (35) CHARACTER SET WIN1251 COLLATE WIN1251,
    STREETTYPE INTEGER,
    HOUSE INTEGER,
    KORP VARCHAR (2) CHARACTER SET WIN1251 COLLATE WIN1251,
    NOMER VARCHAR (3) CHARACTER SET WIN1251 COLLATE WIN1251,
    TEL1 VARCHAR (9) CHARACTER SET WIN1251 COLLATE WIN1251,
    TEL2 VARCHAR (9) CHARACTER SET WIN1251 COLLATE WIN1251,
    D_BIRTH DATE,
    P_BIRTH VARCHAR (45) CHARACTER SET WIN1251 COLLATE WIN1251,
    TABN INTEGER,
    SOZN VARCHAR (12) CHARACTER SET WIN1251 COLLATE WIN1251,
    KLIENTID INTEGER,
    EXPDATE DATE);



/* Indices definition */

CREATE INDEX IDX_PERSON_CEH ON PERSON (CEH);
CREATE INDEX IDX_PERSON_F ON PERSON (F);
CREATE INDEX IDX_PERSON_I ON PERSON (I);
CREATE UNIQUE INDEX IDX_PERSON_ID ON PERSON (ID);
CREATE INDEX IDX_PERSON_KLIENTID ON PERSON (KLIENTID);
CREATE INDEX IDX_PERSON_O ON PERSON (O);
CREATE INDEX IDX_PERSON_STATE ON PERSON (STATE);

SET TERM ^ ;

/* Triggers definition */



/* Trigger: AI_PERSON_ID */
CREATE TRIGGER AI_PERSON_ID FOR PERSON ACTIVE
BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
      NEW.ID = GEN_ID(PERSON_ID_GEN, 1);
END
^


SET TERM ; ^

и

CREATE TABLE PERENUM (
    NCARD VARCHAR (18) CHARACTER SET WIN1251 COLLATE WIN1251,
    NLSOLD VARCHAR (20) CHARACTER SET WIN1251 COLLATE WIN1251,
    NLSNEW VARCHAR (20) CHARACTER SET WIN1251 COLLATE WIN1251);

/* Indices definition */

CREATE UNIQUE INDEX IDX_NLSNEW ON PERENUM (NLSNEW);
CREATE UNIQUE INDEX IDX_NLSOLD ON PERENUM (NLSOLD);

Как видишь в PERENUM у меня уникальные индексы т.ч. две записи с одинаковым значением отменяются
NT Man
Дата: 23.10.2005 21:54:34
Про JOIN в курсе, но в моём случае он жутко тормозит т.к. записи в таблице PERENUM сортируются по всем полям.
Kull Damned
Дата: 23.10.2005 22:06:30
Про JOIN в курсе
Не верю! (ц)
но в моём случае он жутко тормозит
Тоже не верю.
т.к. записи в таблице PERENUM сортируются по всем полям.
Сортировки я не заметил...
Еще раз спрашиваю: ЧТО ГОВОРИТ СЕРВЕР В ОТВЕТ НА ТВОЙ ЗАПРОС?

Posted via ActualForum NNTP Server 1.3

NT Man
Дата: 23.10.2005 22:29:53
Ну не стал я полностью писать запрос зачем же сразу по башке?
Ok, исправляюсь:
SELECT
  PERSON.*,
  (select PERENUM.NLSOLD from perenum where  PERSON.NLS=PERENUM.NLSNEW)
FROM
 PERSON
WHERE (PERSON.KLIENTID=:KLIENTID)AND(Всякие фильтры)AND(всякие фильтры)
ORDER BY название поля
Запрос формируется динамически т.е. фильтрация и сортировка теоретически могут происходить по любым полям.
Затем я стал запрос упрощать чтоб узнать где зло сидит и получилось, то, что в первом посту.
Насчёт тормозов при использовании JOIN отвечаю на 100%.
Для проектирования и исследования работы запросов использую EMS InterBase & FireBird Manager 3 он измеряет скорость запросов.
Идём дальше ошибка воспроизводиться только на Embedded варианте, т.е. если установить нормальный FB сервер то всё нормально притензий нету. Но хотелось бы чтобы работал Embedded Сервер. А на нём что моя Delphi программа выдаёт "Project bla-bla-bla raised exception class EAccessViolation with message 'Access violation at address 04E5B6ED in module 'gds32.dll'. Read of address 000000000'. Process stopped. Use Step or Run to continue." А EMS InterBase & FireBird Manager 3 при выполнении этого запроса зависает так что только диспетчер задач помогает. Опять же на нормальном сервере всё Ok. Воспроизводил не на одной машине под разными операционками.
VF
Дата: 24.10.2005 07:04:29
замени gds32.dll на fbembed.dll (то есть второе от эмбедеда переименуй в первое)...
Карабас Барабас
Дата: 24.10.2005 08:01:38
Было нечто подобное, когда файл кодировок лежал не там. fbintl.dll
Можешь для проверки filemon-ом посмотреть, где он ищется, туда его и положить

Posted via ActualForum NNTP Server 1.3

NT Man
Дата: 24.10.2005 09:46:51
VF
замени gds32.dll на fbembed.dll (то есть второе от эмбедеда переименуй в первое)...

Именно так и делаю и кладу всё в System32
Карабас Барабас
Было нечто подобное, когда файл кодировок лежал не там. fbintl.dll
Можешь для проверки filemon-ом посмотреть, где он ищется, туда его и положить
Posted via ActualForum NNTP Server 1.3

Спасибо за подсказку. Проверю и отпишусь.
sag494
Дата: 24.10.2005 10:07:52
NT Man
Пишу вот такой запрос:
SELECT  PERSON.*,
  (select PERENUM.NLSOLD from perenum where  PERSON.NLS=PERENUM.NLSNEW)
FROM PERSON
На Firebird 1.5.2.4731 Win32 вся работает пучком, а на Firebird 1.5.2.4731 embedded win32 не работает нифига.
без подзапроса работает без ошибки?
NT Man
Про JOIN в курсе, но в моём случае он жутко тормозит т.к. записи в таблице PERENUM сортируются по всем полям.
нифига не понятно: сортируются по "всем полям подзапроса"?