Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка в ХП [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);

Здесь всего хватает? Я бы поля прописал...


Наверх

Титульная страница Поиск, карта сайта Написать письмо