Текущий архив: 2011.09.11;
Скачать: CL | DM;
Вниз
Не выполняются операторы EXECUTE BLOCK. Найти похожие ветки
← →
Drowsy © (2011-05-24 21:36) [0]сервер 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.
Почему так?
← →
Loginov Dmitry © (2011-05-24 23:00) [1]Во-первых, было бы неплохо навести порядок с клиентской библиотекой и файлом сообщений.
> line @1, column @1
смотрится не очень информативно.
Во-вторых, ParamCheck следует выставить в False.
← →
Drowsy © (2011-05-24 23:20) [2]Поясни, пожалуйста, что это за клиентская библиотека и файл сообщений?
← →
Drowsy © (2011-05-25 01:47) [3]Не понимаю..
такой нормально работает
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
← →
Loginov Dmitry © (2011-05-25 08:21) [4]
> Поясни, пожалуйста, что это за клиентская библиотека и файл
> сообщений?
Твоя программа доступ к FB осуществляет благодаря установленной на этом же компьютере клиентской части FB, основу которой составляет клиентская библиотека (IBX требует, чтобы она называлась GDS32.dll, а вообще - fbclient.dll), run-time пакеты от MS Visual Studio, а также файл сообщений firebird.msg. В том случае, если на компьютере имеется несколько файлов сообщений (от разных версий FB), может возникнуть неразбериха и клиентская библиотека загрузит "чужой" файл сообщений. В результате сообщения об ошибках окажутся неинформативными. Для указания точного местоположения файла сообщений следует сразу после запуска программы вызвать функцию:SetEnvironmentVariable("FIREBIRD", PChar(MsgFilePath));
← →
Кщд (2011-05-25 12:28) [5]>Drowsy © (25.05.11 01:47) [3]
таблица CRUSH существует?
← →
Drowsy © (2011-05-25 17:41) [6]
> 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.
← →
Drowsy © (2011-05-25 17:44) [7]копировал firebird.msg в папку ехе-файла - всё то же.
← →
Loginov Dmitry © (2011-05-25 18:08) [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 20:41) [9]Дмитрий, спасибо за помощь!
Скопировал fbclient.dll в GDS32.dll.
сообщения приняли читаемый вид.
EXECUTE Block( CODE_IN varchar(100) = :CODE_IN )
returns ( COPYREC_CNT_OUT varchar(100))
as
declare variable nNAME Type 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 оба варианта работают.
← →
Drowsy © (2011-05-25 20:42) [10]:INTO :nNAME - не работает.
:INTO nNAME - работает.
← →
Loginov Dmitry © (2011-05-25 21:19) [11]Во-первых, еще раз подчеркну, что для обеспечения работоспособности EXECUTE Block в IBX необходимо установить ParamCheck=False. Вместо передачи параметров (через ParamByName) генерируйте SQL-код с заранее заданными значениями. К сожалению в данном случае приходится жертвовать удобством от использования ParamByName в пользу работоспособности FOR SELECT ... INTO :VarName.
Во-вторых, использование двоеточия перед именем переменной не является обязательным требованием. Бывают случаи, когда переменная названа тем же именем, что и поле таблицы. В таких случаях интерпретатору необходимо указывать явно что мы имеем ввиду - поле или переменную. Если используется переменная в рамках SELECT-запроса (например SELECT * FROM TABLE WHERE ID = :ID), то необходимо (крайней мере так принято) перед ней ставить двоеточие. В остальных случаях - по желанию.
← →
Loginov Dmitry © (2011-05-25 21:20) [12]
> :INTO nNAME - работает.
Повезло, что работает. Правильно:INTO :nNAME
илиINTO nNAME
← →
Drowsy © (2011-05-25 21:49) [13]
> :INTO
это очепятка (увлёкся двоеточиями) в скрипте, конечно, INTO))
> Правильно: INTO :nNAME или INTO nNAME
INTO :nNAME - не проходит, в расшифровке ошибки пишет ? на :
> Вместо передачи параметров (через ParamByName) генерируйте
> SQL-код с заранее заданными значениями.
Может быть это очень простой и частный случай, но
тестовый код, который я здесь нарисовал, работает с передачей входного параметра. (текст из Edit-а, передаю через параметр :CODE_IN и Query
возвращает набор)
← →
Loginov Dmitry © (2011-05-25 22:34) [14]
> 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 23:22) [15]в 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
Страницы: 1 вся ветка
Текущий архив: 2011.09.11;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.01 c