![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перестал работать скрипт [IB5.x, FireBird 1.5.3]
pavel_guzhanov © (2007-04-16 08:45:00)Здравствуйте! Приведенный ниже скрипт работал нормально на БД InterBase5.6. При переходе на FireBird 1.5.3 работать перестал. Я предполагаю, что это из-за отличий и ограничений в языке SQL у разных баз. Может быть кто-то заметит в синтаксисе фрагменты, которые работают в IB5.6 и не смогут работать в FB 1.5.3?
SET NAMES WIN1251;
CONNECT 'base.gdb' USER 'SYSDBA' PASSWORD '111';
delete from ann where accn_id in (select accn_id from accn where cont_id = 3751);
create exception ERR$TMP 'Неверно задан номер';
set term ^;
CREATE PROCEDURE PROC$TMP
AS
declare variable CONT_J_ID integer;
declare variable CONT_ID integer;
declare variable ACCN_PREF varchar(8);
declare variable ACCN_NO integer;
declare variable ACCN_SUFF varchar(8);
declare variable STATUS smallint;
declare variable FIO varchar(128);
declare variable OPEN_DATE date;
begin
begin
select CONT_ID from CONT
where CONT_NAME = '2020000'
into :CONT_J_ID;
when any do exception ERR$TMP;
end
for
select
A.ACCN_PREF, A.ACCN_NO, A.ACCN_SUFF, A.STATUS,
(select FIO from MEMB M where M.MEMB_ID = A.MEMB_ID) as FIO,
A.OPEN_DATE
from ACCN A
where A.CONT_ID = :CONT_J_ID and A.META_ACCN <> 'T'
into
:ACCN_PREF, :ACCN_NO, :ACCN_SUFF, :STATUS, :FIO, :OPEN_DATE
as cursor FOO
do
begin
CONT_ID = gen_id(CONT_ID_GEN, 1);
insert into CONT (
CONT_ID,
CONT_PREF,
CONT_NO,
CONT_SUFF,
FILIAL,
CONT_TYPE,
HIDDEN,
STATUS,
DEP_NAME,
OPEN_DATE,
PERIOD,
COM_1, COM_2, COM_PRC, COM_OUTPENS, COM_OUTHEIR, COM_OUTCASH, COM_MOVE, COM_CLOSE,
TYPE_COM_1, TYPE_COM_2, TYPE_COM_PRC, TYPE_COM_OUTPENS, TYPE_COM_OUTHEIR, TYPE_COM_OUTCASH, TYPE_COM_MOVE, TYPE_COM_CLOSE,
TYPE_COM_1C, TYPE_COM_2C, TYPE_COM_PRCC, TYPE_COM_OUTPENSC, TYPE_COM_OUTHEIRC, TYPE_COM_OUTCASHC, TYPE_COM_MOVEC, TYPE_COM_CLOSEC)
values (
:CONT_ID,
:ACCN_PREF,
:ACCN_NO,
:ACCN_SUFF,
0,
2,
'F',
:STATUS,
:FIO,
:OPEN_DATE,
1,
0, 0, 0, 0, 0, 0, 0, 0,
'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F',
'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F');
update ACCN
set CONT_ID = :CONT_ID
where current of FOO;
end
/* delete from CONT where CONT_ID = :CONT_J_ID;*/
exit;
end^
set term ;^
execute procedure PROC$TMP;
commit work;
drop procedure PROC$TMP;
drop exception ERR$TMP;
exit;
COMMIT WORK;
EXIT;
Карелин Артем (2007-04-16 12:41:00) [1]Я бы посоветовал убрать проверку ошибки и посмотреть что за ошибку сервер на самом деле выдает. А так опишу чем утро порадовало меня...
Мне сегодня звонили юзеры, они открыли файл базы FB екселем и спрашивали, почему же у них не работает теперь программа...
pavel_guzhanov (2007-04-16 12:27:00) [2]
> Не в тему, но:
> > CONNECT 'base.gdb' USER 'SYSDBA' PASSWORD '111';
> И каждый знает вот это? И везде одно и то же?
Естественно, это я указал в том тексте, который запостил в форум. На самом деле эти данные (кроме имени пользователя) совсем другие.
> зная об уровне компетентности оставшихся :)
Если бы не смайлик, я бы оскорбился :о))
Johnmen (2007-04-16 12:12:00) [3]Я бы тоже посоветовал что-нибудь, да только беспокоит
>зная об уровне компетентности оставшихся :)
:)
Desdechado (2007-04-16 11:58:00) [4]Не в тему, но:
> CONNECT 'base.gdb' USER 'SYSDBA' PASSWORD '111';
И каждый знает вот это? И везде одно и то же?
Jan1 (2007-04-16 11:51:00) [5]2 автор
уже давно бы скачал IBExpert да отдебажил свою ХП. И время зря не тратил и много чего узнал бы.
ЮЮ (2007-04-16 11:28:00) [6]>Стал выдавать сообщение 'Неверно задан номер', при том, что номер задан правильно.
Правильный номер это тот номер, которого ещё нет в таблице CONT. Если уже есть, то он считается неправильным. (Если я правильно понял смысл when any do exception ERR$TMP).
Т.к. в INSERTE в CONT это поле не задается, остается предполагать, что оно где-то задается/сбрасываеися в триггере. Или было установлено последним из уже неработающих прогаммистов для "поралича", зная об уровне компетентности оставшихся :)
DrPass (2007-04-16 11:22:00) [7]
> Он и возвращает не единственное значение... А потом просто
> пробегает циклом по всем полученным значениям
В данном скрипте он никуда не пробегает - он ожидает единственное значение и выдает ошибку... неизвестно какую, т.к. она давится when any. Убери да посмотри. Так или иначе, проблемы судя по всему не с Firebird, а с целостностью данных
pavel_guzhanov (2007-04-16 11:04:00) [8]
> Откуда сервер должен знать, что select CONT_ID from CONT
> ... возвращает единственное значение?
Он и возвращает не единственное значение... А потом просто пробегает циклом по всем полученным значениям
PEAKTOP (2007-04-16 09:57:00) [9]Помоему, Johnmen как всегда прав:
> Откуда сервер должен знать, что select CONT_ID from CONT ... возвращает единственное значение?
Попробуй
> begin
> select first 1CONT_ID from CONT
> where CONT_NAME = '2020000'
> into :CONT_J_ID;
> when any do exception ERR$TMP;
> end
если скрипт пойдет без ошибок, понятно станет где копать ....
Johnmen (2007-04-16 09:51:00) [10]
> Cont_id - это автоинкрементное поле, первичный ключ..
Ну и? CONT_NAME не ключ ведь. И индекса по нему нет уникального, как я понимаю...
pavel_guzhanov (2007-04-16 09:40:00) [11]Cont_id - это автоинкрементное поле, первичный ключ.. Этот скрипт запускают в филиалах из IBExpert. Запускают не программисты. Работали они под IB, но теперь решили все перевести под один стандарт, под FB. Переход и работа основных программ прошли безболезненно, а с этим скриптом - проблема, причем в двух филиалах одинаковая. Скрипты в обоих филиалах идентичны. Писались они давно, используются несколько лет. Те, кто писал эти скрипты, уже давно у нас не работают.
Johnmen (2007-04-16 09:33:00) [12]И ещё. Откуда сервер должен знать, что select CONT_ID from CONT ... возвращает единственное значение?
Johnmen (2007-04-16 09:30:00) [13]Кто обрабатывал этот скрипт? И кто сейчас?
pavel_guzhanov (2007-04-16 09:27:00) [14]
> А ты сделал backup под IB5.6 и restore под FB1.5?
да, это делается у нас обязательно при переходе с IB на FB. Но скрипта этого нет в базе, он запускается при необходимости из внешнего файла.
Johnmen (2007-04-16 09:23:00) [15]А ты сделал backup под IB5.6 и restore под FB1.5?
pavel_guzhanov (2007-04-16 09:19:00) [16]Стал выдавать сообщение 'Неверно задан номер', при том, что номер задан правильно.
Значит ошибка в этом месте:
> begin
> select CONT_ID from CONT
> where CONT_NAME = '2020000'
> into :CONT_J_ID;
> when any do exception ERR$TMP;
> end
Как это записать в виде, который был бы понятен FireBird?
Jan1 (2007-04-16 08:59:00) [17]1. Что значит перестал?
2. Запустите его в IBExpert - там есть отладка ХП.