Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2016, 12:19   #1
VHomer
Пользователь
 
Регистрация: 11.10.2008
Сообщений: 82
По умолчанию Выполнение скрипта через IBSQL

Добрый день! Я работаю с Oracle и в Delphi скрипты выполнения через OraSql. Тут понадобилось написать программулина в связки с Firebird, поэто работаю через компоненты Interbase. По аналогии взял IBSQL.
Запихал туда скрипт по аналогии с тем, как я делаю в Oracle (адаптировав по FB).

execute block
as
declare lSurname varchar(99);
declare lName varchar(99);
declare pos integer;
declare pp varchar(99);
begin
pp = 'Имя Фамилия';
--pp = :aName;
pos = POSITION(' ', pp);
lSurname = SUBSTRING(pp FROM 1 FOR pos-1);
lName = SUBSTRING(pp FROM pos+1 FOR CHAR_LENGTH(pp));
insert into pupil(pupil_id,surname,name)
values (GEN_ID(gen_pupil_id,1),:lSurname,: lName);
end

Если передаче в переменную pp строки напрямую, все выполняется без проблем. Но мне оно не надо, я в цикле подаю разные строки, т.е. мне нужен параметр.
Для этого я комментирую строку pp = 'Имя Фамилия';, а следующую раскомментил.
В коде пишу:
IBSQL1.ParamByName('aName').AsStrin g := st; // в цикле переменная ST меняется
IBSQL1.ExecQuery;

При выполнении возникает ошибка Column unknown aName. Причем тут Column, я параметр хочу задать.

Добавляю наверх declare aName varchar(99); и тут начинаются ошибки Field 'aName' not found

Причем если я в IBSQL запихиваю простой запрос с Select, то с аналогичным способом передачи параметров проблем не возникает.

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

Последний раз редактировалось VHomer; 18.11.2016 в 12:29.
VHomer вне форума Ответить с цитированием
Старый 18.11.2016, 14:10   #2
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

ну любезный позвольте aName а где он тут

Код:
execute block
as
declare lSurname varchar(99);
declare lName varchar(99);
declare pos integer;
declare pp varchar(99);
begin
pp = 'Имя Фамилия'; 
pos = POSITION(' ', pp);
lSurname = SUBSTRING(pp FROM 1 FOR pos-1);
lName = SUBSTRING(pp FROM pos+1 FOR CHAR_LENGTH(pp));
insert into pupil(pupil_id,surname,name)
values (GEN_ID(gen_pupil_id,1),:lSurname,: lName);
end
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 18.11.2016, 14:17   #3
VHomer
Пользователь
 
Регистрация: 11.10.2008
Сообщений: 82
По умолчанию

Цитата:
Сообщение от BARNEY Посмотреть сообщение
ну любезный позвольте aName а где он тут

Код:
execute block
as
declare lSurname varchar(99);
declare lName varchar(99);
declare pos integer;
declare pp varchar(99);
begin
pp = 'Имя Фамилия'; 
pos = POSITION(' ', pp);
lSurname = SUBSTRING(pp FROM 1 FOR pos-1);
lName = SUBSTRING(pp FROM pos+1 FOR CHAR_LENGTH(pp));
insert into pupil(pupil_id,surname,name)
values (GEN_ID(gen_pupil_id,1),:lSurname,: lName);
end
Я же не так написал. Вы удалили закоменчанную строку --pp = :aName;
Я ж пишу : 'Для этого я комментирую строку pp = 'Имя Фамилия';, а следующую раскомментил.' Как раз pp = :aName раскомментировал и получилось
execute block
as
declare lSurname varchar(99);
declare lName varchar(99);
declare pos integer;
declare pp varchar(99);
begin
pp = :aName;
pos = POSITION(' ', pp);
lSurname = SUBSTRING(pp FROM 1 FOR pos-1);
lName = SUBSTRING(pp FROM pos+1 FOR CHAR_LENGTH(pp));
insert into pupil(pupil_id,surname,name)
values (GEN_ID(gen_pupil_id,1),:lSurname,: lName);
end
VHomer вне форума Ответить с цитированием
Старый 18.11.2016, 14:41   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А после записи скрипта в IBSQL.SQL проверить какие параметры компонент вообще опознал, в цикле for i:=0 to IBSQL.Params.Count-1
посмотреть на IBSQL.Params[i].Name или как там имя параметра называется. Я к тому, что параметры в датасетах обычно заточены под значения в VALUES, SET-ах, условиях во WHERE. А здесь еще возможно какой-то конфликт между способом задания параметров и синтаксисом скриптов огнептицы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.11.2016, 15:03   #5
VHomer
Пользователь
 
Регистрация: 11.10.2008
Сообщений: 82
По умолчанию

IBSQL.Params.Count = 0. Ни одного параметра не нашлось.
VHomer вне форума Ответить с цитированием
Старый 18.11.2016, 15:10   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ну тогда либо процедуру, либо программно скрипт формировать без параметров. Либо еще вариант - что-то особенное есть в способе задания параметров для IBSQL, здесь не подскажу, не пользовался. Кстати с :lSurname выполнялось и как параметр не опознавалось. ADO бы опознал

ADD может предварительно ParseSQL выполнить?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 18.11.2016 в 15:14.
Аватар вне форума Ответить с цитированием
Старый 18.11.2016, 15:18   #7
VHomer
Пользователь
 
Регистрация: 11.10.2008
Сообщений: 82
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Кстати с :lSurname выполнялось и как параметр не опознавалось. ADO бы опознал
А я так понимаю, что это особенность FB при инсерте в блоке begin ... end. Я уже все что мне надо запихал в хранимую процедуру и там инсерт так же делал - ко всем переменным в values приписывал : впереди.
VHomer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Остановить выполнение скрипта max9123 Общие вопросы Delphi 2 02.11.2013 11:59
выполнение скрипта по крону Mortimoro PHP 3 03.09.2012 15:30
Выполнение скрипта через 5 секунд Arassir PHP 2 22.06.2011 21:40
Автоматическое выполнение скрипта maksikus PHP 16 04.09.2010 06:13
Выполнение скрипта по расписанию Sparky PHP 7 30.10.2009 16:33