Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all 1677 articles
Browse latest View live

Invalid request DLR. Ошибка при компиляции процедуры

$
0
0
Добрый день!

Возникла такая ситуация, есть хранимка
в какойто момент появилась такая ошибка

автор
Invalid token.
invalid request BLR at offset 875.
BLR syntax error: expected valid BLR code at offset 875, encountered 190.


Changes will be rolled back...


что это как лечить?

Скорость SELECT-запроса и составной индекс по INTEGER и TIMESTAMP

$
0
0
Имеется таблица "Транзакции", в которой поля "ID карты" (CARD_ID INTEGER) и "время транзакции" (TRANTIME TIMESTAMP) входят в составной индекс, примерно так:
CREATE INDEX TRAN_IDX1 ON TRAN (CARD_ID, TRANTIME);


за период с 1.01.2017 по 9.08.2017 в таблице TRAN накоплено 367 тыс. транзакций по 11 тыс. картам, однако по карте с CARD_ID=100 всего лишь 2 транзакции.

Если я пишу запрос:

SELECT * FROM TRAN WHERE CARD_ID=100 AND 
TRANTIME BETWEEN '2017-01-01' AND '2017-08-09'


то он возвращает 2 транзакции, причем запрос выполняется в среднем 46 мс.
При этом IBExpert показывает:
Fetches from cache = 1 867



Если в запросе интервал времени небольшой (транзакции были 25 и 29 марта):
SELECT * FROM TRAN WHERE CARD_ID=100 AND 
TRANTIME BETWEEN '2017-03-25' and '2017-03-30'


то запрос выполняется за 0 мс (редко 16 мс).
При этом IBExpert показывает:
Fetches from cache = 78


Разница - десятки раз!

Для меня это оказалось сюрпризом, поскольку я считал, что указание в индексе первым полем CARD_ID сужает интервал поиска и транзакции по другим картам не влияют на скорость выборки по конкретной карте, а по факту выходит, что влияют, и очень здорово.

Данная проблема снижения производительности свойственна только Firebird или это общая проблема, свойственная всем СУБД. В версиях Firebird 2.5 и 3.0 ситуация та же?

P.S. Версия Firebird 2.1.5 (SuperServer).

Диапазон дат (от даты до даты)

$
0
0
подскажите, как реализовать выборку дат по строкам за период
select from ...

или
for <date1> to <date2>

Firebird 3 ошибка подключения с FirebirdSql.Data.FirebirdClient.FbConnection

$
0
0
Решил попробовать Firebird 3.
Установил сервер 3.0.2 на Ubuntu, внес изменения в настройки:
AuthServer = Spr, Legacy_Auth
AuthClient = Spr, Legacy_Auth
UserManager = Srp, Legacy_UserManager
WireCrypt = Enabled
WireCompression = false
RemoteServicePort = 3050
RemoteBindAddress =

Создал пустую базу и разрешил удаленное подключение в databases.conf
test.fdb = /var/lib/firebird/3.0/data/test.fdb { RemoteAccess = true }

В VisualStudio создал проект и с nuget установил FirebirdSql.Data.FirebirdClient 5.9.1.
var connection = new FirebirdSql.Data.FirebirdClient.FbConnection();
connection.ConnectionString = "character set=WIN1251;data source=Firebird3;initial catalog=test.fdb;user id=SYSDBA;password=masterkey;";
connection.Open();

При попытке подключения в клиенте получаю ошибку : "Error occurred during login, please check server firebird.log for details". В логе сервера ошибка: "Authentication error No matching plugins on server". При подключении через IBExpert или isql-fb все проходит успешно.
Подскажите, куда смотреть?

Ошибка во view при изменении домена строкового поля таблицы.

$
0
0
Добрый день.

FB 2.5.6 CS.
Все действия выполнялись в isql.

Создадим таблицу и заполним ее данными:
SQL> CREATE TABLE T (
CON>     ID   INTEGER NOT NULL,
CON>     VAL  VARCHAR(10)
CON> );


На базе таблицы создадим view:
SQL> CREATE OR ALTER VIEW V (
CON>     ID,
CON>     VAL )
CON> AS
CON> SELECT ID,
CON>        VAL
CON>   FROM T
CON> ;


Создадим домен и изменим на него тип поля VAL:
SQL> CREATE DOMAIN D_STR10 AS VARCHAR(10);

SQL> ALTER TABLE T ALTER COLUMN VAL TYPE D_STR10;


Ошибка попытки удалния системного домена:
Statement failed, SQLSTATE = 42000
unsuccessful metadata update
-cannot delete
-DOMAIN RDB$2
-there are 1 dependencies



Немного изменим сценарий:

Создадим таблицу:
SQL> CREATE DOMAIN D_STR10 AS VARCHAR(10);

SQL> CREATE TABLE T (
CON>     ID   INTEGER NOT NULL,
CON>     VAL  D_STR10
CON> );


На базе таблицы создадим view:
SQL> CREATE OR ALTER VIEW V(
CON>     ID,
CON>     VAL)
CON> AS
CON> SELECT ID,
CON>        VAL
CON>   FROM T
CON> ;


Изменим тип и заполним значения поля VAL:
SQL> CREATE DOMAIN D_STR20 AS VARCHAR(20);

SQL> ALTER TABLE T ALTER COLUMN VAL TYPE D_STR20;

SQL> INSERT INTO T (ID, VAL)
CON>        VALUES (1, '---------1---------1');
SQL> INSERT INTO T (ID, VAL)
CON>        VALUES (2, '---------2---------2');
SQL> COMMIT;


Запрос из view вызывает ошибку:
SQL> SELECT *
CON>   FROM V;

          ID VAL
============ ==========
Statement failed, SQLSTATE = 22001
arithmetic exception, numeric overflow, or string truncation
-string right truncation


Понятно, что после перекомпиляции view ошибка исчезает.

С уважением, Polesov.

Установка 3.0.2 на Ubuntu Gnome 17.04 amd64

$
0
0
Доброе время суток,

слил, распаковал, запустил:
запустил sudo sh ~\Firebird-3.0.2.32703-0.amd64\install.sh

в ответ получил:
Pleace install requered library 'libtommath' befor firebird ...

установил из пакетов версию 1.0-4 (вроде последняя)

после этого пошла установка FB но после запроса пароля для SYSDBA отвалилась с сообщением: /opt/firebird/bin/qsec: error while loading shared libraries: libtommath.so.0: cannot open shared object file: No such file or directory

Fatal error running 'systemctl --quiet firebird-superserver.service' - exiting

нахожусь в задумчивости что делать?

View с использованием left join. ООоооочень долго

$
0
0
Господа, ну помогите с запросом или объясните, что не так.
Есть 2 таблицы. 1-я с организациями, у которых есть почтовый индекс. (1675 записей)
2-я - БД почтовых индексов России. (46000 примерно записей)
Пишу view:

CREATE VIEW ORG_VIEW (GUID, ORG_NAME, REGION)
AS
SELECT
ORGALLINFO.GUID,
ORGALLINFO.ORGNAME,
d1.REGION
FROM ORGALLINFO
Left join PINDX12 d1 on d1.POSTALCODE=ORGALLINFO.ORGPOSTINDEX
;

После чего выполняю
SELECT COUNT(*) FROM org_view

Запрос выполняется больше 3-х минут.

Где засада?

Баг или фича при работе с курсорной переменной в Firebird 3.0.2?

$
0
0
Приветствую уважаемых пользователе форума!
Использую Firebird v3.0.2 x64. Написал в хранимой процедуре конструкцию вида:
  for select t1.grp
        from table1 t1
          join table2 t2 using(id)
        group by t1.grp
  as cursor c
  do begin

    select count(*)
      from table1 t1
        join table2 t2 using(id)
        join table3 t3 using(id1)
      where t1.grp=:с.grp
    into :tmp;

  end

Всего цикл с for select возвращает 7 значений с.grp от 1 до 7. Общее время работы ~ 55 секунд. Запускаю отдельно запрос:
  for select t1.grp
        from table1 t1
          join table2 t2 using(id)
        group by t1.grp
  as cursor c
  do begin
  end 

Он отрабатывает за 5 секунд. Запускаю отдельно запрос с заданным параметром:
  select count(*)
    from table1 t1
      join table2 t2 using(id)
      join table3 t3 using(id1)
    where t1.grp=1

Отрабатывает за сотые доли секунды. Ну а совместная конструкция отрабатывает 55 секунд как я уже и писал.
Внес небольшое изменение в исходную конструкцию - передачу значения параметра через обычную переменную. И о чудо - время работы конструкции уменьшилось до 5 секунд:
  for select t1.grp
        from table1 t1
          join table2 t2 using(id)
        group by t1.grp
  as cursor c
  do begin

    tmp_grp = c.grp;

    select count(*)
      from table1 t1
        join table2 t2 using(id)
        join table3 t3 using(id1)
      where t1.grp=:tmp_grp
    into :tmp;

  end


Собственно вопрос: есть ли какое-то разумное объяснение такого поведения Firebird или это просто баг?

IN + LIST

$
0
0
Подскажите пожалуйста
таблица 1
idunn
1 100
1 200
2 110


таблица 2
unn name
100 яблоко
200 груша
110 слива


как выбрать все значения из таблицы 2 у которых id = 1

Модератор: Пользуйся тегом CSV

RDB$GET_CONTEXT и диалекты

$
0
0
FB 2.5.7.27050
в 1-м диалекте на запросе:
select
  cast(coalesce(RDB$GET_CONTEXT('USER_TRANSACTION', 'AROW'), 0) as integer) + 1
  +
  cast(RDB$SET_CONTEXT('USER_TRANSACTION', 'AROW', cast(coalesce(RDB$GET_CONTEXT('USER_TRANSACTION', 'AROW'), 0) as integer) + 1) as integer)*0
  as ROWNUM
from TABLENAME T

на швабре будет написано:
Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
numeric value is out of range.

если переписать так:
select
  cast(cast(coalesce(RDB$GET_CONTEXT('USER_TRANSACTION', 'AROW'), 0) as double precision) + 1 as integer)
  +
  cast(RDB$SET_CONTEXT('USER_TRANSACTION', 'AROW', cast(coalesce(RDB$GET_CONTEXT('USER_TRANSACTION', 'AROW'), 0) as double precision) + 1) as integer)*0
  as ROWNUM
from TABLENAME T

то всё работает
PS: в третьем диалекте работает и первый вариант. С учётом каста к integer это баг или так и задумано?

Долгий первый UPDATE

$
0
0
Добрый день
Бьюсь над такой задачей - есть утилита импорта документов в базу FB 2.5.3, при импорте идет update таблицы заголовка документов. По логам вижу, что при апдейте данных первого документа время выполнения запросов 2-10 минут, все остальные апдейты проходят на секунды. Таблица большая с кучей триггеров. Как можно это исправить? От автора утилиты получил объяснение, что время уходит на первый prepare, остальные в рамках того же коннекта время на подготовку не тратят. Архитектура Classic.

сравнение is distinct для blob-полей?

$
0
0
Здравствуйте,

Два поля описаны как BLOB SUB_TYPE 0 SEGMENT SIZE 80, и их сравнение a is distinct from b, всегда дает true, хотя в них записаны одинаковые значения. Идея такого сравнения в принципе бредовая? На вскидку, кажется, почему бы нет? сравнить побайтово...

Firebird 3.02

Заранее спасибо за ответы

Расположение файла базы

$
0
0
Здравствуйте.

Где нибудь в служебных таблицах есть информация о физическом расположении файла базы?

Почему не видит динамически создаваемые таблицы

$
0
0
Здравствуйте.

В процедуре динамически дропаю и создаю таблицу. Она прекрасно создается.
Далее в этой же процедуре динамически пытаюсь наполнить ее данными не получается.
Пишет таблица не существует.

Может какие то настройки нужно включить?

Выбор всех имеющихся мастеров + деталей в одном запросе

$
0
0
Добрый день. Если написать так:
select masters.field1, masters.field2, details.field1 from masters, details where masters.master_uid = details.master_uid

то выберутся только мастера с деталями.
Как выбрать всех мастеров из таблицы + имеющиеся у них детали, с условием, что не у каждого мастера есть детали?

Сложный запрос

$
0
0
Есть три таблицы
Пункты
таблица KFR
P1, P2 и тд.
в пунктах есть точки A1, A2, И тд.
kfr pps
A1 P1
A2 P1
A3 P2


Операции в течении дня по точкам
Таблица OPA
sd- сумма дебет
sk - сумма кредит
dat -Дата
kfr sd sk dat
A1 10 0 01.09.2017
A2 20 0 01.09.2017
A2 0 15 01.09.2017


Баланс на каждый день по точке
Таблица BAL
si - исходящий баоланс
od - по дебету
ok - по кредиту
kfr dat si od ok
A1 01.09.2017 10 10 0
A2 01.09.2017 5 20 15


необходимо получить итог по пункту
чтобы исходящий остаток si (пункта) был как сумма si точек
sv = si - od+ ok
dat si sd sk sv
01.09.2017 15 10 0 0
01.09.2017 15 20 0 0
01.09.2017 15 0 015


Если в пункте одна точка я сделал так
SELECT
b.dat,b.si,o.sd, o.sk
(b.si - b.od + b.ok) AS sv
FROM
bal b, opa o
WHERE
o.dat=b.dat
AND
o.dat between '01.08.2017' AND '31.08.2017'
AND
o.kfr=b.kfr and b.kfr = 'A1'
ORDER BY
b.dat


как сделать для пункта с несколькими точками

Быстродействие селекта с джойнами по одной таблице

$
0
0
Ногами не бейте. Хочу разобраться. Может и было обсуждение, но не нашёл.
Нарулили "глобальный" справочник. В результате приходится писать запросы такого вида:
select a.longname, b.longname, c.shortname, d.longname, e.longname, f.shortname
from sprav a
        inner join sprav b on b.id2=a.id and b.priznak=2
        inner join sprav c on c.id2=b.id and c.priznak=3
        inner join sprav d on d.id3=a.id2  and d.priznak=4
        inner join sprav e on e.id2=d.id and e.priznak=5
        inner join sprav f on f.id3=e.id and f.priznak=6
where a.priznak=1

Сейчас меня интересует только быстродействие. Проблемы с целостностью данных и удобством работы при такой схеме понимаю. Теперь вопрос. Если бы в приведённом мной запросе было бы шесть таблиц, скорость была бы выше? Ниже? Такой же? Индексы по id-шникам есть. FB3, если что.

Процедура с возращенные результата (EXECUTE BLOCK RETURNS)

$
0
0
Здравствуйте!
Не силен в написании процедур. Понадобилось написать процедуры с возращенные результата,
к примеру такую (взято из руководства по firebird 2.5):
EXECUTE BLOCK (
  x DOUBLE PRECISION = 4, 
  y DOUBLE PRECISION = 2)
RETURNS (gmean DOUBLE PRECISION)
AS
BEGIN
  gmean = sqrt(x*y);
  SUSPEND;
END

Но что то ничего не получается. Ошибка:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, column 24.
4.

FB3 не работает as cursor

$
0
0
Нужна помощь. Я не могу понять где ошибка. В 2.5 все работало, поставили 3 - появилась ошибка, хотя я ошибки не вижу:

for Select right(t.psi_name,2) from obj t where ((t.id_vida_ob=:id_vida) and (char_length(t.psi_name)=8)) into :PSI_NAME_OBJ AS CURSOR TCUR do
    begin

      if (:name is not null) then
        update obj set name_obj=:name where current of TCUR;    
    end


--------------------------------------------------------------------------------------------------------------
can't format message 13:896 -- message file C:\Windows\SysWOW64\firebird.msg not found.
unsuccessful metadata update.
CREATE OR ALTER PROCEDURE NORMAL_NAME_KS failed.
Dynamic SQL Error.
SQL error code = -104.
Invalid command.
no column name specified for column number 1 in derived table <Missing arg #2 - possibly status vector overflow>.

Firebird 1.5 и Firebird 3.0 в одной сети

$
0
0
Добрый день.
В сети есть множество программ, которые пользуют Firebird 1.5. Возникла необходимость установить программу под Firebird 3.0. После установки Firebird 3.0 (super server) на локальном компьютере встали колом службы Firebird 1.5 на сервере (просто зависли, причем не смогли перезапуститься до перезагрузки сервера), а все клиенты поотрубались. Как такое может быть, какие - то широковещательные запросы от Firebird 3.0?
Viewing all 1677 articles
Browse latest View live