![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка в ХП [IB6.x]
Mike Kouzmine © (2004-05-14 23:52:00)К вечеру голова не соображает вообще...
ALTER PROCEDURE ADD_FILIAL (
SCLAD INTEGER)
AS
DECLARE VARIABLE NUM INTEGER;
DECLARE VARIABLE NAME VARCHAR(20) CHARACTER SET WIN1251;
DECLARE VARIABLE FILIAL INTEGER;
begin
FILIAL = GEN_ID(GEN_SCLADS_ID,1);
INSERT INTO SCLADS
VALUES(:FILIAL, 'НОВЫЙ ФИЛИАЛ',1,1);
FOR SELECT NUM, NAME FROM GROUPS
WHERE SCLAD = :SCLAD INTO :NUM, :NAME DO
BEGIN
INSERT INTO GROUPS
VALUES(:FILIAL , :NUM, :NAME);
END
end
SCLADS(INTEGER,VARCHAR,INTEGER,INTEGER)
GROUPS(INTEGER,INTEGER,VARCHAR)
Ошибка
An error was found in the application program input parameters for the SQL statement.
Dynamic SQL Error.
SQL error code = -804.
Count of read-write columns does not equal count of values.
Работаю в IB Expert
DrPass (2004-05-15 00:50:00) [1]Очепятка, имел в виду
insert into groups(sclad, num, name) select :sclad, num, name from groups...
Mike Kouzmine (2004-05-15 00:47:00) [2]Курдль © (15.05.04 00:39)
DrPass © (15.05.04 00:29)
Спасибо. Удалил процедуру, написал заново - заработало...
DrPass (2004-05-15 00:46:00) [3]Я же не говорю, что она обязательно зациклится - это зависит от данных. Можно, например, сначала выбрать, потом вставить:
insert into groups(sclad, num, name) select from groups(:sclad, num, name)...
А если еще подумать, то ошибка, похоже, возникает вообще не в процедуре - а где-нибудь в приложении, которое ее вызывает.
Курдль (2004-05-15 00:39:00) [4]Я не применял такие конструкции, но сдается, что одновременно и
VALUES и FOR SELECT употреблять не следует.
Mike Kouzmine (2004-05-15 00:38:00) [5]DrPass © (15.05.04 00:29) [4] А как поступать, если мне надо выбрать группу записей из таблицы и в нее же вставить эти же записи, но с другим ключем?
Mike Kouzmine (2004-05-15 00:34:00) [6]DrPass © (15.05.04 00:29) [4] Наверное ты прав, попробую. Но дело не в этом. Повидимому. Нормально компилировалась, но я изменил входящие параметры, после этого появилась ошибка.
Mike Kouzmine (2004-05-15 00:30:00) [7]Курдль © (15.05.04 00:26) [3] Не совсем понял. Поясни пожалуйста.
DrPass (2004-05-15 00:29:00) [8]Я всегда придерживаюсь нескольких правил (просто так удобнее), например:
1. При выполнении INSERT явно указываю поля, по которым идет вставка
2. Не допускаю совпадений переменных и параметров с именами полей
3. Не делаю операций вида
FOR SELECT NUM, NAME FROM GROUPS ... DO...
INSERT INTO GROUPS
VALUES(:FILIAL , :NUM, :NAME);
потому как процедура, выбирающая записи и тут же вставляющая их в ту же самую таблицу, вполне способна вогнать IB в бесконечный цикл выборки-вставки (это фича такая)
Начни с реализации первого правила, если судить по твоей ошибке
Курдль (2004-05-15 00:26:00) [9]Ну а строчкой ниже: FOR SELECT NUM, NAME FROM GROUPS
В переменной типа запись SCLADS 4 поля, а выбираются для нее 2
Mike Kouzmine (2004-05-15 00:13:00) [10]Курдль © (15.05.04 00:06) [1] Если посмотреть пониже текста процедуры, то можно заметить структуры используемых таблиц.
Курдль (2004-05-15 00:06:00) [11]
> INSERT INTO SCLADS
> VALUES(:FILIAL, 'НОВЫЙ ФИЛИАЛ',1,1);
Здесь всего хватает? Я бы поля прописал...