Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поправте код, ишибку нужно исправить :) SQL 
:(
    Опции темы
BpIstorick
  Дата 27.7.2006, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.4.2006

Репутация: нет
Всего: нет



В книге Валерия Фаронова "Delphi 2005. Разработка приложений для баз данных и интернета" есть код на 42 странице

Код

CREATE TRIGGER BEF_INS_TYPE FOR TYPES BEFORE INSERT AS
BEGIN
NEW.TYPEID = GEN_ID(GEN_TYPE, 1);
END


У меня выдает ошибку smile

Таблица Paradox7
Сервер IB 6

помогите smile исправьте, базы данных только начал учить (ну и если есть толковая мысль, то подскажите, стоит по этому автору дальше учится или есть альтернатива на порядок лучше?) 

p.s. ТОварисчи!!! не отмалчивайтесь smile из-за этой загвоздки неохото дальше читать книжку smile 

Это сообщение отредактировал(а) BpIstorick - 27.7.2006, 07:36
PM MAIL   Вверх
Akella
Дата 27.7.2006, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(BpIstorick @  27.7.2006,  00:07 Найти цитируемый пост)
Таблица Paradox7Сервер IB 6

 smile  какое отношение имеет paradox к InterBase?????

Добавлено @ 08:43 
Код

CREATE TRIGGER BEF_INS_TYPE FOR TYPES BEFORE INSERT AS
BEGIN
NEW.TYPEID = GEN_ID(GEN_TYPE, 1);
END

для InterBase нормально, вроде без ошибок
условия: должна быть таблица TYPES создана, должен быть создан генератор GEN_TYPE, в таблице TYPES должно существовать  поле TYPEID типа Int (в качестве первичного ключа) и эти 3 условия должны быть соблюдены до того, как ты начнёшь создавать этот триггер 
PM MAIL   Вверх
superVad
Дата 27.7.2006, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



для работы с IB (создание бд, таблиц, тригеров, генераторов....) юзай IBExpert 
PM MAIL   Вверх
Akella
Дата 27.7.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



http://www.hk-software.net/ibexpert.com/co...2943-0-0-00.php
для жителей бывшего СССР бесплатен, главное, чтобы в системе была установлена кодовая страница Win1251 
PM MAIL   Вверх
BpIstorick
Дата 27.7.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.4.2006

Репутация: нет
Всего: нет



Моя ошибка smile по незнанию, как оказалось в книге вначале описан метод создания таблицы в Paradox, потом в IB,

то есть дело идет в InterBase

Но тем не менее ошибка не ушла

добавляю описание ошибки
Цитата

Dynamic SQL Error
SQL error code = -104
Unexpected end of command
Statement: CREATE TRIGGER BEF_INS_TYPE FOR TYPES BEFORE INSERT AS
BEGIN
NEW.TYPEID = GEN_ID(GEN_TYPE, 1)


посмотрел:
1. есть таблица  TYPES
2. есть поле TypeID типа SmallInt (может в этом проблема smile ? )
3. есть генератор "Name: GEN_TYPE; CurrentValue: 0"

полный код который я исполнял включая ошибочный

Код

Вот как создается таблица TYPES БД «Книголюб»:
CREATE TABLE TYPES(
TYPEID SMALLINT NOT NULL PRIMARY KEY,
TNAME VARCHAR(23))
Создание генератора для поля TYPEID:
CREATE GENERATOR GENJTYPE;
SET GENERATOR GEN_TYPE TO 0
Создание триггера:
CREATE TRIGGER BEF_INS_TYPE FOR TYPES BEFORE INSERT AS
BEGIN
NEW.TYPEID = GEN_ID(GEN_TYPE, 1);
END
Ввод записи:
INSERT INTO TYPES(TYPEID, TNAME)
VALUES(0, "Поставка на реализацию")


соответственно у меня сейчас создание таблицы и генератора не проходит smile ввиду их существования 
PM MAIL   Вверх
superVad
Дата 27.7.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



попробуй так

SET TERM ^ ;
CREATE TRIGGER BEF_INS_TYPE FOR TYPES BEFORE INSERT AS    
BEGIN    
NEW.TYPEID = GEN_ID(GEN_TYPE, 1);    
END
^
SET TERM ; ^

Добавлено @ 11:44 
Цитата

Разделители в хранимых процедурах

Обратите внимание, что оператор внутри процедуры заканчивается точкой с запятой (;). Как известно, точка с запятой является стандартным разделителем команд в SQL - она является сигналом интерпретатору SQL, что текст команды введен полностью и надо начинать его обрабатывать. Не получится ли так, что, обнаружив точку с запятой в середине ХП, интерпретатор SQL сочтет, что команда введена полностью и попытается выполнить часть хранимой процедуры? Это предположение не лишено смысла. Действительно, если создать файл, в который записать вышеприведенный пример, добавить команду соединения с базы данных и попытаться выполнить этот SQL-скрипт с помощью интерпретатора isql, то будет возвращена ошибка, связанная с неожиданным, по мнению интерпретатора, окончанием команды создания хранимой процедуры. Если создавать хранимые процедуры с помощью файлов SQL-скриптов, без использования специализированных инструментов разработчика InterBase, то необходимо перед каждой командой создания ХП (то же относи 1ся и к триггерам) менять разделитель команд скрипта на другой символ, отличный от точки с запятой, а после текста ХП восстанавливать его обратно. Команда isql, изменяющая разделитель предложений SQL, выглядит так:

SET TERM <new_term><old_term> 

Для типичного случая создания хранимой процедуры это выглядит так: 

SET TERM ^;
CREATE PROCEDURE some_procedure
... . .
END
^
SET TERM ;^


читай Мир InterBase. Можно найти в электронном виде.  

Это сообщение отредактировал(а) superVad - 27.7.2006, 11:46
PM MAIL   Вверх
jack128
Дата 27.7.2006, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 18.5.2005

Репутация: нет
Всего: 4



Цитата(BpIstorick @  27.7.2006,  00:07 Найти цитируемый пост)
NEW.TYPEID = GEN_ID(GEN_TYPE, 1);

вообще за такие триггеры нужно резать тупыми ножницами.

Код

if (new.typeid is null) then
  NEW.TYPEID = GEN_ID(GEN_TYPE, 1);
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.