Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.24;
Скачать: CL | DM;

Вниз

Добавление записи в Oracle   Найти похожие ветки 

 
David   (2003-02-06 15:39) [0]

Есть простая таблица с одним полем типа Number. При добавлении записи динамическим SQL параметрами возникает исключительная ситуация. Код программы:

with SqlQuery do begin
SQL.Clear;
SQL.Add("INSERT INTO testlog (logid) VALUES (:idval)");

Params.Clear;
Params.CreateParam(ftInteger, "idval", ptInput);
Params.ParamByName("idval").Value := 1;

try
ExecSQL();
except
........
end;
end;

Если добавляю запись с переменной типа String в таблицу с полем типа Char, то все проходит нормально. Заранее благодарен за любые советы.


 
Reindeer Moss Eater   (2003-02-06 15:43) [1]

with SqlQuery do begin
SQL.Clear;
SQL.Add("INSERT INTO testlog (logid) VALUES (:idval)");
ParamByName("idval").Value := 1;
try
ExecSQL();
except
........
end;
end;


 
Danilka ©   (2003-02-06 16:01) [2]

with SqlQuery do begin
SQL.text:="INSERT INTO testlog (logid) VALUES ("+inttostr(1)+")";
try
ExecSQL();
except
........
end;
end;


 
Duce ©   (2003-02-06 16:16) [3]

пРОДОЛЖАЯ Данилку ;)

Так, по-моему, и вернее и быстрее и легче будет - динамически
собирать полную строку СКЛ...если ситуация позволяет.


 
David   (2003-02-06 16:17) [4]

Если написать без параметров как Danilka, то все работает, но хотелось бы знать как реализовать параметрический SQL. К сожалению, вариант Reindeer Moss Eater тоже не функционирует.


 
Reindeer Moss Eater   (2003-02-06 16:20) [5]

К сожалению никто из не знает что такое у тебя SqlQuery


 
dimis   (2003-02-06 16:25) [6]


> Reindeer Moss Eater (06.02.03 16:20)
> К сожалению никто из не знает что такое у тебя SqlQuery

и что за ошибка


 
David   (2003-02-06 16:38) [7]

Прошу прощения. SqlQuery имеет тип TSQLQuery. Я использую dbExpress. Ошибка: Invalid field type.


 
Reindeer Moss Eater   (2003-02-06 16:47) [8]

Сдается мне, что параметрический запрос заработал, и в ошибке виноват не он


 
passm ©   (2003-02-06 16:55) [9]

Тип указан?
ParamByName("idval").DataType:= ...
ParamByName("idval").Value:= ...


 
David   (2003-02-06 17:06) [10]

Одинаково не работает и с указанием типа
ParamByName("idval").DataType := ftInteger и без указания. Я тоже склоняюсь к тому, что причина не в SQL, т.к. с Paradox все работает без проблем.


 
Sergey13 ©   (2003-02-07 09:30) [11]

2David (06.02.03 16:38)
>Ошибка: Invalid field type.
Так это делфовая ошибка или оракловая вываливается?

2Duce © (06.02.03 16:16)
>Так, по-моему, и вернее и быстрее и легче будет - динамически
собирать полную строку СКЛ...если ситуация позволяет.

Это тебе проще, а серверу труднее. 8-(


 
Danilka ©   (2003-02-07 10:06) [12]

Sergey13 © (07.02.03 09:30)
>Это тебе проще, а серверу труднее. 8-(

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


 
Johnny Smith ©   (2003-02-07 10:15) [13]

2Danilka © (07.02.03 10:06)
Так вот, докладываю: после того, как ты передал запрос на сервер, он там компилируется.
Если есть параметры, то при повторном вызове запроса он НЕ ПЕРЕКОМПИЛИРУЕТСЯ, а просто ставит значения параметров в готовый скомпиленный запрос.
Если же передавать текст запроса каждый раз по-новому, то он каждый раз будет компилироваться, т.е. это - просто-напросто излишняя нагрузка на сервер.


 
Sergey13 ©   (2003-02-07 10:18) [14]

2Danilka © (07.02.03 10:06)
>серьезно?
Абсолютно. Если этот запрос работает много раз, то при склеивании SQLпредложения сервер каждый раз проверяет его и компилит. А в случае с переменными он просто биндует их и выполняет. Т.е. исключается парсинг.


 
Danilka ©   (2003-02-07 10:26) [15]

Johnny Smith © (07.02.03 10:15)
Sergey13 © (07.02.03 10:18)
:))
все ясно.
правда, парсинг такого запроса займет времени гораздо меньше, чем лишнее "общение" клиента с сервером.


 
Sergey13 ©   (2003-02-07 10:45) [16]

2Danilka © (07.02.03 10:26)
>правда, парсинг такого запроса займет времени гораздо меньше, чем лишнее "общение" клиента с сервером.
Одного может быть. А если этот запрос отрабатывает несколько раз в секунду (там что то про LOG было вроде) - тогда ого-го сколько отожрет. Кроме того, каждый такой "новый" запрос отожрет несколько памяти в шаредпуле. Это конечно не очень страшно, но и хорошего тоже мало. Может выкидывать от туда действительно нужные запросы.


 
David   (2003-02-07 11:20) [17]

2Sergey13
Если быть точным, то ошибка dbExpress, но это может быть реакцией на ошибку, которая произошла в Oracle. Не понимаю, почему это происходит с цифровыми параметрами, а со строковыми все в порядке?
2Danilka
Таблица, в которую заносятся данные, в самом деле, является как-бы логом с довольно большой нагрузкой. Кроме того, функции общения с БД вынесены в отдельную библиотеку, которая пишется под конкретную БД (Oracle, Paradox, ...). Основная программа, таким образом, от БД не зависит, ее дело только сформировать SQL и передать его с параметрами дальше. Поэтому и запрос параметрический.


 
Sergey13 ©   (2003-02-07 11:33) [18]

2David (07.02.03 11:20)
Попробуй отработать этот запрос в чем нибудь другом, хоть в плюсе, или ПЛ/СКЛ Дивелопере. С именами схем не может быть проблем? Убери try except -пусть прога ругнется по настоящему. 8-) Какой то код у ошибки должен быть, и на этот код какое то описание наверно существует.



 
David   (2003-02-07 11:44) [19]

Невероятно, но факт. Если параметр определить как строковый, т.е.
Params.ParamByName("idval").DataType := ftString;
Params.ParamByName("idval").Value := 1;
то все работает. Кто бы мог подумать. Что касается сообщения, то оно такое и есть: dbExpress error: Invalid field type. Может у dbExpress свои типы для параметров?



Страницы: 1 вся ветка

Текущий архив: 2003.02.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
1-75960
Zilog
2003-02-12 14:18
2003.02.24
Обработка событий. Или скорее перехватывание событий...


1-75893
wdr
2003-02-13 05:56
2003.02.24
Exel


4-76214
Kokopelli
2003-01-10 14:13
2003.02.24
открытие файла при запуске приложения


3-75805
roottim
2003-02-04 16:53
2003.02.24
PostgreeSQL VS SAP DB


7-76212
izyum
2002-12-20 14:52
2003.02.24
События клавиатуры