Подскажите пожалуйста, что это за ошибка: message length error (encountered 0, expected 32)
возникает при вызове программно хранимой процедуры: execute procedure name(param);
при вызове хранимой процедуры в ручную, через isql все работает.
Код БД и хранимой процедуры:
CREATE DATABASE "test.gdb" user 'SYSDBA' password 'masterkey';
CREATE TABLE title
(
id INTEGER NOT NULL,
name VARCHAR(20) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO title VALUES ( 1, 'qqqqq');
INSERT INTO title VALUES ( 2, 'wwwww');
INSERT INTO title VALUES ( 3, 'eeeee');
INSERT INTO title VALUES ( 4, 'rrrrr');
INSERT INTO title VALUES ( 5, 'ttttt');
SET TERM !! ;
CREATE PROCEDURE sp (param INTEGER)
RETURNS (param2 INTEGER, param3 VARCHAR(20))
AS
DECLARE VARIABLE n INTEGER;
DECLARE VARIABLE ret INTEGER;
BEGIN
ret = 5;
FOR SELECT id,name FROM title WHERE id =: param INTO :n,:param3
DO
ret = ret + n;
param2 = ret;
END !!
exit !!
SET TERM ; !!
Здравствуйте, Hiden, Вы писали:
H>Здравствуйте, vvu, Вы писали:
vvu>>Здравствуйте, Hiden, Вы писали:
H>>>Здравствуйте, Tonal-, Вы писали:
vvu>>А где в ХП SUSPEND
H>так если я вызываю хранимую процедуру вручную, при помощи isql то она выполняется H>там точно обязательно писать SUSPEND?
а иначе она ничего не вернет . suspend не нужен только, если у тебя будет процедура действия (нет RETURNS). А у тебя процедура выбора.
Здравствуйте, vvu, Вы писали:
vvu>Здравствуйте, Hiden, Вы писали:
H>>Здравствуйте, vvu, Вы писали:
vvu>>>Здравствуйте, Hiden, Вы писали:
H>>>>Здравствуйте, Tonal-, Вы писали:
vvu>>>А где в ХП SUSPEND
H>>так если я вызываю хранимую процедуру вручную, при помощи isql то она выполняется H>>там точно обязательно писать SUSPEND?
vvu>а иначе она ничего не вернет . suspend не нужен только, если у тебя будет процедура действия (нет RETURNS). А у тебя процедура выбора.
Написал вот так, но ничего не изменилось
SET TERM !! ;
CREATE PROCEDURE sp (param INTEGER)
RETURNS (param2 INTEGER, param3 VARCHAR(20))
AS
DECLARE VARIABLE n INTEGER;
DECLARE VARIABLE ret INTEGER;
BEGIN
ret = 5;
FOR SELECT id,name FROM title WHERE id =: param INTO :n,:param3
DO
ret = ret + n;
param2 = ret;
SUSPEND;
END !!
exit !!
SET TERM ; !!
Здравствуйте, Hiden, Вы писали:
H>Написал вот так, но ничего не изменилось
Используй, во-первых, тэги форматирования. Так будет проще понять, чего ты хочешь. А во-вторых, вот так работает. Имена таблиц, переменных подствь свои.
create procedure f_cross_bank_s
returns (
id integer,
id_firm integer,
id_bank integer)
as
begin
for select id,
id_firm,
id_bank
from f_cross_bank
into :id,
:id_firm,
:id_bank
do
begin
suspend;
end
end
Здравствуйте, Hiden, Вы писали:
H>Здравствуйте, vvu, Вы писали:
vvu>>Здравствуйте, Hiden, Вы писали:
H>>>Здравствуйте, vvu, Вы писали:
vvu>>>>Здравствуйте, Hiden, Вы писали:
H>>>>>Здравствуйте, Tonal-, Вы писали:
vvu>>>>А где в ХП SUSPEND
H>>>так если я вызываю хранимую процедуру вручную, при помощи isql то она выполняется H>>>там точно обязательно писать SUSPEND?
vvu>>а иначе она ничего не вернет . suspend не нужен только, если у тебя будет процедура действия (нет RETURNS). А у тебя процедура выбора.
а ты бегин энд не пропустил. Должны быть вот тут:
H>Написал вот так, но ничего не изменилось H>SET TERM !! ; H>CREATE PROCEDURE sp (param INTEGER) H>RETURNS (param2 INTEGER, param3 VARCHAR(20)) H>AS H>DECLARE VARIABLE n INTEGER; H>DECLARE VARIABLE ret INTEGER; H>BEGIN H>ret = 5; H>FOR SELECT id,name FROM title WHERE id =: param INTO :n,:param3 H>DO
BEGIN H>ret = ret + n; H>param2 = ret; H>SUSPEND;
END; H>END !! H>exit !! H>SET TERM ; !!
[Sorry, skipped] H> Написал вот так, но ничего не изменилось H> SET TERM !! ; H> CREATE PROCEDURE sp (param INTEGER) H> RETURNS (param2 INTEGER, param3 VARCHAR(20)) H> AS H> DECLARE VARIABLE n INTEGER; H> DECLARE VARIABLE ret INTEGER; H> BEGIN H> ret = 5; H> FOR SELECT id,name FROM title WHERE id =: param INTO :n,:param3 H> DO
Тут нужен BEGIN H> ret = ret + n; H> param2 = ret; H> SUSPEND;
Тут нужен ещё один END H> END !! H> exit !!
^^^^^^^^^^^
Тут exit не нужен H> SET TERM ; !!
В своей программе замени вызов
EXECUTE PROCEDURE...
на
SELECT * FROM ...
Привет, Tonal-!
Вы пишешь 02 декабря 2006:
T> Разобрался. T> Тебе надо использовать isc_dsql_execute2 или isc_dsql_exec_immed2 — T> только они понимают выходные параметры.
Здравствуйте, Alex.Che, Вы писали:
AC>Привет, Tonal-! AC>Вы пишешь 02 декабря 2006:
T>> Разобрался. T>> Тебе надо использовать isc_dsql_execute2 или isc_dsql_exec_immed2 — T>> только они понимают выходные параметры.
AC>Но фетчить можно только из первой.
А зачем ему фетчить? У него процедура выбора, вызываемая через EXECUTE, стало быть данные вернуться в выходных параметрах.
[Sorry, skipped] AC>> Но фетчить можно только из первой. T> А зачем ему фетчить? У него процедура выбора, вызываемая через EXECUTE, T> стало быть данные вернуться в выходных параметрах.
Независимо от того, что он там изобретает, нужен ему фетч, или нет,
isc_dsql_execute2 универсальнее, гибче и удобнее.
Хотя бы уже тем, что аллокировав стейтмент, мы можем узнать
тип запроса, типы входных и выходных параметров и т.д. и .т.п.
Что в случае isc_dsql_execute_imed2 не представляется возможным.
Здравствуйте, Alex.Che, Вы писали: AC>isc_dsql_execute2 универсальнее, гибче и удобнее.
Ну я как бы с этим не спорю.
Просто привёл список доступных функций для решения его проблемы.
Ну а уж выбирать всяко ему.
Здравствуйте, Alex.Che, Вы писали:
AC>Привет, Hiden! AC>Вы пишешь 01 декабря 2006:
AC>[Sorry, skipped] H>> Написал вот так, но ничего не изменилось H>> SET TERM !! ; H>> CREATE PROCEDURE sp (param INTEGER) H>> RETURNS (param2 INTEGER, param3 VARCHAR(20)) H>> AS H>> DECLARE VARIABLE n INTEGER; H>> DECLARE VARIABLE ret INTEGER; H>> BEGIN H>> ret = 5; H>> FOR SELECT id,name FROM title WHERE id =: param INTO :n,:param3 H>> DO AC>Тут нужен BEGIN H>> ret = ret + n; H>> param2 = ret; H>> SUSPEND; AC>Тут нужен ещё один END H>> END !! H>> exit !! AC>^^^^^^^^^^^ AC>Тут exit не нужен H>> SET TERM ; !!
AC>В своей программе замени вызов AC>EXECUTE PROCEDURE... AC>на AC>SELECT * FROM ...
AC>-- AC>With best regards, Alex Cherednichenko.
Написал процедуру как вы и говорите, даже сделал ее еще проще:
SET TERM !! ;
CREATE PROCEDURE sp (param INTEGER)
RETURNS (param2 INTEGER, param3 VARCHAR(20))
AS
BEGIN
FOR SELECT id,name FROM title WHERE id =: param
INTO :param2,:param3
DO
BEGIN
SUSPEND;
END !!
END !!
exit !!
SET TERM ; !!
но теперь у меня уже выдается ошибка
Dinamic SQL Error
-SQL error code = -104
-Unexpected end of command
а если еще не писать exit !!. то будет следующая ошибка
Expected end of statement, encountered EOF
так как я создаю БД и ХП из makefile при помощи вызова isql, а exit !! прекращает вызов isql