![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не выполняются операторы EXECUTE BLOCK. [D6]
Drowsy © (2011-05-24 21:36:00)сервер Firebird2.5. Delphi6, IBX.
IBExpert v.2011.03.04
В Sql-редакторе эксперта execute block выполняются,
а в ibx ошибки
Dynamic SQL error
SQL error Code = @1
Token unknown - line @1, column @1
@1.
Почему так?
Drowsy (2011-05-25 23:22:00) [1]в TibQuery :
ParamCheck := False;
Text :=
'execute block
returns (
COPYREC_CNT_OUT integer)
as
declare variable v_NAME type of column TEST.NAME;
begin
COPYREC_CNT_OUT = 0;
for select
NAME
from TEST
into :v_NAME
do
begin
COPYREC_CNT_OUT = COPYREC_CNT_OUT + 1;
insert into TEST (NAME)
values ( :v_NAME);
end
suspend;
end'
при выполнении этого запроса
XLQLDA index out of range
если в выделенном тексте убрать двоеточие, то
"нет поля v_Name"
если ParamCheck := True, то ? на :v_Name
Loginov Dmitry (2011-05-25 22:34:00) [2]
> INTO :nNAME - не проходит, в расшифровке ошибки пишет ?
> на :
Не знаю в чем причина. У меня с отключенным ParamCheck все работает.
> Может быть это очень простой и частный случай, но
> тестовый код, который я здесь нарисовал, работает с передачей
> входного параметра. (текст из Edit-а, передаю через параметр
> :CODE_IN и Query
> возвращает набор)
Кто мешает переделать код, например таким образом:
IBDataSet1.SelectSQL.Text :=
'EXECUTE Block returns ( COPYREC_CNT_OUT integer) '+
.....................
'copyrec_cnt_out = ' + QuotedStr(Edit1.Text) + '; '+
......................
Drowsy (2011-05-25 21:49:00) [3]
> :INTO
это очепятка (увлёкся двоеточиями) в скрипте, конечно, INTO))
> Правильно: INTO :nNAME или INTO nNAME
INTO :nNAME - не проходит, в расшифровке ошибки пишет ? на :
> Вместо передачи параметров (через ParamByName) генерируйте
> SQL-код с заранее заданными значениями.
Может быть это очень простой и частный случай, но
тестовый код, который я здесь нарисовал, работает с передачей входного параметра. (текст из Edit-а, передаю через параметр :CODE_IN и Query
возвращает набор)
Loginov Dmitry (2011-05-25 21:20:00) [4]
> :INTO nNAME - работает.
Повезло, что работает. Правильно:INTO :nNAMEилиINTO nNAME
Loginov Dmitry (2011-05-25 21:19:00) [5]Во-первых, еще раз подчеркну, что для обеспечения работоспособности EXECUTE Block в IBX необходимо установить ParamCheck=False. Вместо передачи параметров (через ParamByName) генерируйте SQL-код с заранее заданными значениями. К сожалению в данном случае приходится жертвовать удобством от использования ParamByName в пользу работоспособности FOR SELECT ... INTO :VarName.
Во-вторых, использование двоеточия перед именем переменной не является обязательным требованием. Бывают случаи, когда переменная названа тем же именем, что и поле таблицы. В таких случаях интерпретатору необходимо указывать явно что мы имеем ввиду - поле или переменную. Если используется переменная в рамках SELECT-запроса (например SELECT * FROM TABLE WHERE ID = :ID), то необходимо (крайней мере так принято) перед ней ставить двоеточие. В остальных случаях - по желанию.
Drowsy (2011-05-25 20:42:00) [6]:INTO :nNAME - не работает.
:INTO nNAME - работает.
Drowsy (2011-05-25 20:41:00) [7]Дмитрий, спасибо за помощь!
Скопировал fbclient.dll в GDS32.dll.
сообщения приняли читаемый вид.
EXECUTE Block( CODE_IN varchar(100) = :CODE_IN )
returns ( COPYREC_CNT_OUT varchar(100))
as
declare variable nNAMEType Of Column CRUSH1.NAME;
begin
copyrec_cnt_out = Code_IN;
for select
CRUSH1.NAME
from CRUSH1 where ( CODE in (1,2,3))
:INTO nNAME
do
begin
copyrec_cnt_out = copyrec_cnt_out || nNAME;
end
suspend;
end
почему-то ругается на использование двоеточия перед именем локальной переменной в теле блока.
если его (двоеточие) убрать, то всё работает.
В IBExperte оба варианта работают.
Loginov Dmitry (2011-05-25 18:08:00) [8]
> клиенская библиотека
> C:\PROGRAM FILES\FIREBIRD\FIREBIRD_2_5\bin\fbclient.dll
> -(размер 548864)
Как уже говорилось, IBX грузит библиотеку GDS32.dll.
Данная библиотека по умолчанию устанавливается в каталог System32.
Возможно, что там находится старая версия GDS32.dll (например от Interbase 6.x).
Drowsy (2011-05-25 17:44:00) [9]копировал firebird.msg в папку ехе-файла - всё то же.
Drowsy (2011-05-25 17:41:00) [10]
> Loginov Dmitry © (25.05.11 08:21) [4]
На компе установлен только Firebird 2.5. с размещением по умолчанию
C:\PROGRAM FILES\FIREBIRD\FIREBIRD_2_5\
клиенская библиотека
C:\PROGRAM FILES\FIREBIRD\FIREBIRD_2_5\bin\fbclient.dll -(размер 548864)
файл сообщений
C:\PROGRAM FILES\FIREBIRD\FIREBIRD_2_5\firebird.msg -(размер 148556)
в процедуре создания главной формы программы указал
bool := SetEnvironmentVariable(PChar('FIREBIRD'), PChar('C:\PROGRAM FILES\FIREBIRD\FIREBIRD_2_5\'));
bool := SetEnvironmentVariable(PChar('FIREBIRD_MSG'), PChar('C:\PROGRAM FILES\FIREBIRD\FIREBIRD_2_5\'));
ошибка всё равно
Dynamic SQL error
SQL error Code = @1
Token unknown - line @1, column @1
@1.
Кщд (2011-05-25 12:28:00) [11]>Drowsy © (25.05.11 01:47) [3]
таблица CRUSH существует?
Loginov Dmitry (2011-05-25 08:21:00) [12]
> Поясни, пожалуйста, что это за клиентская библиотека и файл
> сообщений?
Твоя программа доступ к FB осуществляет благодаря установленной на этом же компьютере клиентской части FB, основу которой составляет клиентская библиотека (IBX требует, чтобы она называлась GDS32.dll, а вообще - fbclient.dll), run-time пакеты от MS Visual Studio, а также файл сообщений firebird.msg. В том случае, если на компьютере имеется несколько файлов сообщений (от разных версий FB), может возникнуть неразбериха и клиентская библиотека загрузит "чужой" файл сообщений. В результате сообщения об ошибках окажутся неинформативными. Для указания точного местоположения файла сообщений следует сразу после запуска программы вызвать функцию:
SetEnvironmentVariable('FIREBIRD', PChar(MsgFilePath));
Drowsy (2011-05-25 01:47:00) [13]Не понимаю..
такой нормально работает
EXECUTE Block( CODE_IN varchar(100) = :inCODE_IN )
returns ( COPYREC_CNT_OUT integer)
as
declare variable NAME Type Of Column CRUSH1.NAME;
begin
copyrec_cnt_out = 0;
begin
copyrec_cnt_out = copyrec_cnt_out + 1;
end
suspend;
end
а этот ругается собаками...
EXECUTE Block( CODE_IN varchar(100) = :inCODE_IN )
returns ( COPYREC_CNT_OUT integer)
as
declare variable NAME Type Of Column CRUSH1.NAME;
begin
copyrec_cnt_out = 0;
for select
NAME
from CRUSH where ( CODE = 1)
INTO
:NAME
do
begin
copyrec_cnt_out = copyrec_cnt_out + 1;
end
suspend;
end
Drowsy (2011-05-24 23:20:00) [14]Поясни, пожалуйста, что это за клиентская библиотека и файл сообщений?
Loginov Dmitry (2011-05-24 23:00:00) [15]Во-первых, было бы неплохо навести порядок с клиентской библиотекой и файлом сообщений.
> line @1, column @1
смотрится не очень информативно.
Во-вторых, ParamCheck следует выставить в False.