Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
15-1305711086
MiAn
2011-05-18 13:31
2011.09.11
Работа через https, получение SSL-сертификата?


2-1306402091
varvar123
2011-05-26 13:28
2011.09.11
Помогите прописать путь к файлу


2-1306142943
vlgrig1961
2011-05-23 13:29
2011.09.11
Как передать переменную типа TextFile в виде параметра


15-1305627810
Den
2011-05-17 14:23
2011.09.11
SQL запрос


2-1306745074
Очень злой
2011-05-30 12:44
2011.09.11
Можно ли создать объект не известного заранее класса