interbase в Linux
От: Hiden  
Дата: 30.11.06 12:54
Оценка:
Подскажите пожалуйста, что это за ошибка: message length error (encountered 0, expected 32)
возникает при вызове программно хранимой процедуры: execute procedure name(param);
при вызове хранимой процедуры в ручную, через isql все работает.
Re: interbase в Linux
От: Tonal- Россия www.promsoft.ru
Дата: 01.12.06 08:04
Оценка:
Версия сервера какая?
Из какого языка и через какую библиотеку работаешь?
Покажи код вызова.
Re[2]: interbase в Linux
От: Hiden  
Дата: 01.12.06 09:09
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Версия сервера какая?

T>Из какого языка и через какую библиотеку работаешь?
T>Покажи код вызова.

InterBase.v7.5.1
пишу на C++ в Linux

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ibase.h>
....
void check(int x) {
if (x) {
if(status_vector[0] == 1 && status_vector[1])
{
isc_print_status(status_vector);
exit(1);
}
}
}
...
check( isc_attach_database(status_vector, strlen(str), str, &db,sizeof(dpb_buf),dpb_buf));
...
подключение к бд происходит нормально, проверял на select * from title; а при вызове execute procedure sp 3; все компелируется, но при запуске exe файла происходит ошибка
...
int emp_no = 3;
char str1[BUFLEN];
isc_tr_handle trans = NULL;
long status[50];
sprintf(str1, "execute procedure sp %d;",emp_no);
check( isc_start_transaction(status_vector, &trans,1, &db, 0, 0) );
isc_stmt_handle stmt = NULL;

static char id[10], name[50];
check( isc_dsql_allocate_statement(status_vector, &db, &stmt));

XSQLDA ISC_FAR * sqlda;
sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(2));
sqlda->sqln = 2;
sqlda->version = 1;

check( isc_dsql_prepare(status_vector, &trans, &stmt, 0, str1, 1, sqlda));
short i0 = 0, i1 = 0;
sqlda->sqlvar[0].sqldata = (char *) &id;
sqlda->sqlvar[0].sqltype = SQL_TEXT;
sqlda->sqlvar[0].sqlind = &i0;

sqlda->sqlvar[1].sqldata = (char *) &name;
sqlda->sqlvar[1].sqltype = SQL_TEXT;
sqlda->sqlvar[1].sqlind = &i1;

check( isc_dsql_execute(status_vector, &trans, &stmt, 1, NULL));

ISC_STATUS fetch_stat;

while ((fetch_stat = isc_dsql_fetch(status_vector, &stmt, 1, sqlda)) == 0)
{

id[9] = '\0';
name[49] = '\0';
printf("\nid: %s", id);
printf("\nname: %s\n", name);
}
check( isc_dsql_free_statement(status_vector, &stmt, DSQL_drop));

check( isc_commit_transaction(status_vector, &trans) );

if(db) isc_detach_database(status_vector, &db);
return 0;
}

Код БД и хранимой процедуры:
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 ; !!
Re[3]: interbase в Linux
От: vvu  
Дата: 01.12.06 10:22
Оценка:
Здравствуйте, Hiden, Вы писали:

H>Здравствуйте, Tonal-, Вы писали:


А где в ХП SUSPEND
Re[4]: interbase в Linux
От: Hiden  
Дата: 01.12.06 10:26
Оценка:
Здравствуйте, vvu, Вы писали:

vvu>Здравствуйте, Hiden, Вы писали:


H>>Здравствуйте, Tonal-, Вы писали:


vvu>А где в ХП SUSPEND


так если я вызываю хранимую процедуру вручную, при помощи isql то она выполняется
там точно обязательно писать SUSPEND?
Re[5]: interbase в Linux
От: vvu  
Дата: 01.12.06 12:29
Оценка:
Здравствуйте, Hiden, Вы писали:

H>Здравствуйте, vvu, Вы писали:


vvu>>Здравствуйте, Hiden, Вы писали:


H>>>Здравствуйте, Tonal-, Вы писали:


vvu>>А где в ХП SUSPEND


H>так если я вызываю хранимую процедуру вручную, при помощи isql то она выполняется

H>там точно обязательно писать SUSPEND?

а иначе она ничего не вернет . suspend не нужен только, если у тебя будет процедура действия (нет RETURNS). А у тебя процедура выбора.
Re[6]: interbase в Linux
От: Hiden  
Дата: 01.12.06 12:54
Оценка:
Здравствуйте, 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 ; !!
Re[7]: interbase в Linux
От: LuciferArh Россия  
Дата: 01.12.06 13:06
Оценка:
Здравствуйте, 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
... << RSDN@Home 1.2.0 alpha rev. 667>>
Re[7]: interbase в Linux
От: vvu  
Дата: 01.12.06 13:25
Оценка:
Здравствуйте, 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 ; !!
Re[3]: interbase в Linux
От: Tonal- Россия www.promsoft.ru
Дата: 01.12.06 16:24
Оценка:
Попробуй isc_dsql_execute_immediate.
Re[3]: interbase в Linux
От: Tonal- Россия www.promsoft.ru
Дата: 01.12.06 17:50
Оценка: +1
Здравствуйте, Hiden, Вы писали:
H>InterBase.v7.5.1
H>пишу на C++ в Linux
А почему бы не использовать ibpp и не писать велосипед?
Re[4]: interbase в Linux
От: Alex.Che  
Дата: 02.12.06 13:52
Оценка:
Привет, Tonal-!
Вы пишешь 01 декабря 2006:

T> Попробуй isc_dsql_execute_immediate.


Интересно, как ты собираешься из неё получать данные?..

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[6]: interbase в Linux
От: Alex.Che  
Дата: 02.12.06 13:55
Оценка:
Привет, vvu!
Вы пишешь 01 декабря 2006:

[Sorry, skipped]
v> а иначе она ничего не вернет .
v> suspend не нужен только, если у тебя будет
v> процедура действия (нет RETURNS).

Это не совсем так.

v> А у тебя процедура выбора.


Тут согласен.

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[7]: interbase в Linux
От: Alex.Che  
Дата: 02.12.06 13:58
Оценка:
Привет, Hiden!
Вы пишешь 01 декабря 2006:

[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 ...

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[3]: interbase в Linux
От: Tonal- Россия www.promsoft.ru
Дата: 02.12.06 14:44
Оценка:
Разобрался.
Тебе надо использовать isc_dsql_execute2 или isc_dsql_exec_immed2 — только они понимают выходные параметры.
Re[4]: interbase в Linux
От: Alex.Che  
Дата: 02.12.06 14:47
Оценка:
Привет, Tonal-!
Вы пишешь 02 декабря 2006:

T> Разобрался.

T> Тебе надо использовать isc_dsql_execute2 или isc_dsql_exec_immed2
T> только они понимают выходные параметры.

Но фетчить можно только из первой.

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[5]: interbase в Linux
От: Tonal- Россия www.promsoft.ru
Дата: 02.12.06 14:57
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>Привет, Tonal-!

AC>Вы пишешь 02 декабря 2006:

T>> Разобрался.

T>> Тебе надо использовать isc_dsql_execute2 или isc_dsql_exec_immed2
T>> только они понимают выходные параметры.

AC>Но фетчить можно только из первой.

А зачем ему фетчить? У него процедура выбора, вызываемая через EXECUTE, стало быть данные вернуться в выходных параметрах.
Re[6]: interbase в Linux
От: Alex.Che  
Дата: 03.12.06 13:46
Оценка:
Привет, Tonal-!
Вы пишешь 02 декабря 2006:

[Sorry, skipped]
AC>> Но фетчить можно только из первой.
T> А зачем ему фетчить? У него процедура выбора, вызываемая через EXECUTE,
T> стало быть данные вернуться в выходных параметрах.

Независимо от того, что он там изобретает, нужен ему фетч, или нет,
isc_dsql_execute2 универсальнее, гибче и удобнее.
Хотя бы уже тем, что аллокировав стейтмент, мы можем узнать
тип запроса, типы входных и выходных параметров и т.д. и .т.п.
Что в случае isc_dsql_execute_imed2 не представляется возможным.

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[7]: interbase в Linux
От: Tonal- Россия www.promsoft.ru
Дата: 04.12.06 06:00
Оценка:
Здравствуйте, Alex.Che, Вы писали:
AC>isc_dsql_execute2 универсальнее, гибче и удобнее.
Ну я как бы с этим не спорю.
Просто привёл список доступных функций для решения его проблемы.
Ну а уж выбирать всяко ему.
Re[8]: interbase в Linux
От: Hiden  
Дата: 04.12.06 10:07
Оценка:
Здравствуйте, 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

Dinamic SQL Error
-SQL error code = -104
-Token unknown — line 1, char 0
-END

а если еще не писать exit !!. то будет следующая ошибка
Expected end of statement, encountered EOF
так как я создаю БД и ХП из makefile при помощи вызова isql, а exit !! прекращает вызов isql
Re[9]: interbase в Linux
От: Alex.Che  
Дата: 04.12.06 10:10
Оценка:
Привет, Hiden!
Вы пишешь 04 декабря 2006:

H> а если еще не писать exit !!. то будет следующая ошибка

H> Expected end of statement, encountered EOF
H> так как я создаю БД и ХП из makefile при помощи вызова isql, а exit !!
H> прекращает вызов isql

Убери !! после первого END-а

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[8]: interbase в Linux
От: Hiden  
Дата: 04.12.06 10:24
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Здравствуйте, Alex.Che, Вы писали:

AC>>isc_dsql_execute2 универсальнее, гибче и удобнее.
T>Ну я как бы с этим не спорю.
T>Просто привёл список доступных функций для решения его проблемы.
T>Ну а уж выбирать всяко ему.

Попробывал использовать isc_dsql_execute2, но результат тот же:
message length error (encountered 0, expected 32)
Re[9]: interbase в Linux
От: Alex.Che  
Дата: 04.12.06 10:35
Оценка:
Привет, Hiden!
Вы пишешь 04 декабря 2006:

H> Попробывал использовать isc_dsql_execute2, но результат тот же:

H> message length error (encountered 0, expected 32)

Да не в бобине у тебя дело. (С)
Похоже, у тебя сервер и клент разных версий.
Ищи "лишние" gds32.dll
У "нелишних" сверяй версии.

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[10]: interbase в Linux
От: Hiden  
Дата: 04.12.06 10:51
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>Привет, Hiden!

AC>Вы пишешь 04 декабря 2006:

H>> Попробывал использовать isc_dsql_execute2, но результат тот же:

H>> message length error (encountered 0, expected 32)

AC>Да не в бобине у тебя дело. (С)

AC>Похоже, у тебя сервер и клент разных версий.
AC>Ищи "лишние" gds32.dll
AC>У "нелишних" сверяй версии.

AC>--

AC>With best regards, Alex Cherednichenko.

А в Linux эта библиотека как называется? если так же (gds32.so) то где ее искать, а то что то поиск не может найти
Re[11]: interbase в Linux
От: Alex.Che  
Дата: 04.12.06 11:03
Оценка:
Привет, Hiden!
Вы пишешь 04 декабря 2006:

AC>> Да не в бобине у тебя дело. (С)

AC>> Похоже, у тебя сервер и клент разных версий.
AC>> Ищи "лишние" gds32.dll
AC>> У "нелишних" сверяй версии.

H> А в Linux эта библиотека как называется?


libgds.so — для InterBase, либо же libfbclient.so — для Firebird.

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[12]: interbase в Linux
От: Hiden  
Дата: 04.12.06 12:13
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>Привет, Hiden!

AC>Вы пишешь 04 декабря 2006:

AC>>> Да не в бобине у тебя дело. (С)

AC>>> Похоже, у тебя сервер и клент разных версий.
AC>>> Ищи "лишние" gds32.dll
AC>>> У "нелишних" сверяй версии.

H>> А в Linux эта библиотека как называется?


AC>libgds.so — для InterBase, либо же libfbclient.so — для Firebird.


AC>--

AC>With best regards, Alex Cherednichenko.

Я нашел четыре библиотеки в home/user/ibc/libgds.so, lib/libgds.so, opt/interbase.prev.lnk/lib/libgds.so, usr/lib/libgds.so
Что теперь с ними делать? Как посмотреть в линуксе их версии и как я понимаю лишние надо удалить или заменить, а какие будут лишние???
Re[13]: interbase в Linux
От: Alex.Che  
Дата: 04.12.06 12:55
Оценка:
Привет, Hiden!
Вы пишешь 04 декабря 2006:

H> Я нашел четыре библиотеки в home/user/ibc/libgds.so, lib/libgds.so, opt/interbase.prev.lnk/lib/libgds.so, usr/lib/libgds.so

H> Что теперь с ними делать? Как посмотреть в линуксе их версии.

Тут я помочь не смогу. Я виндузятник, не юниксолог.

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[13]: interbase в Linux
От: Sheridan Россия  
Дата: 04.12.06 13:46
Оценка:
Здравствуйте, Hiden, Вы писали:

H>Я нашел четыре библиотеки в home/user/ibc/libgds.so, lib/libgds.so, opt/interbase.prev.lnk/lib/libgds.so, usr/lib/libgds.so

H>Что теперь с ними делать? Как посмотреть в линуксе их версии и как я понимаю лишние надо удалить или заменить, а какие будут лишние???

1. Откуда запускается сервак?
2. То что ты нашел — файлы или линки на файлы?

Навскидку — скорее всего оно у тебя хватает либо home/user/ibc/libgds.so, либо lib/libgds.so, но скорее всего второе.
Если сумееш натравить strace на запуск сервака БД — увидиш точно.

[RSDN@Home][1.2.0][alpha][668]
[В доме без жильцов — известных насекомых не обрящешь. [К. Прутков]]
Matrix has you...
Re[9]: interbase в Linux
От: Tonal- Россия www.promsoft.ru
Дата: 05.12.06 08:04
Оценка:
Здравствуйте, Hiden, Вы писали:
H>Попробывал использовать isc_dsql_execute2, но результат тот же:
H>message length error (encountered 0, expected 32)
Покажи код.
Ты точно задал куды выходные параметры покласть?
Соощение точно при вызове isc_dsql_execute2 вылетает?
Re[10]: interbase в Linux
От: Hiden  
Дата: 05.12.06 09:03
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Здравствуйте, Hiden, Вы писали:

H>>Попробывал использовать isc_dsql_execute2, но результат тот же:
H>>message length error (encountered 0, expected 32)
T>Покажи код.
T>Ты точно задал куды выходные параметры покласть?
T>Соощение точно при вызове isc_dsql_execute2 вылетает?

check( isc_dsql_prepare(status_vector, &trans, &stmt, 0, str1, 1, sqlda));
short i0 = 0, i1 = 0;
sqlda->sqlvar[0].sqldata = (char *) &id;
sqlda->sqlvar[0].sqltype = SQL_TEXT;
sqlda->sqlvar[0].sqlind = &i0;

sqlda->sqlvar[1].sqldata = (char *) &name;
sqlda->sqlvar[1].sqltype = SQL_TEXT;
sqlda->sqlvar[1].sqlind = &i1;

check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, sqlda, NULL));

ISC_STATUS fetch_stat;

while ((fetch_stat = isc_dsql_fetch(status_vector, &stmt, 1, sqlda)) == 0)
{

id[9] = '\0';
name[49] = '\0';
printf("\nid: %s", id);
printf("\nname: %s\n", name);
}
....
если в str1 записывать select то все работает и в id и name записываются данные, а если там указать execute то возникает такая ошибка
может действительно все дело в несовпадении версий клиента и сервера
Re[11]: interbase в Linux
От: Tonal- Россия www.promsoft.ru
Дата: 05.12.06 10:38
Оценка:
Здравствуйте, Hiden, Вы писали:

H>check( isc_dsql_prepare(status_vector, &trans, &stmt, 0, str1, 1, sqlda));
H>short i0 = 0, i1 = 0;
H>sqlda->sqlvar[0].sqldata = (char *) &id;
H>sqlda->sqlvar[0].sqltype = SQL_TEXT;
H>sqlda->sqlvar[0].sqlind = &i0;

H>sqlda->sqlvar[1].sqldata = (char *) &name;
H>sqlda->sqlvar[1].sqltype = SQL_TEXT;
H>sqlda->sqlvar[1].sqlind = &i1;

H>check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, sqlda, NULL));

У тебя нет входных параметров. Есть только выходные. Стало быть надо поменять местами 2 последних параметра, т.е:
check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, NULL, sqlda));


P.S. Открой доку по функции isc_dsql_execute2 и внимательно вчитайся в эти величественные строки:

XSQLDA* in_xsqlda
Pointer to an optional, previously allocated XSQLDA used for input;
if input parameters are not supplied, set this value to NULL

XSQLDA* out_xsqlda
Pointer to an optional, previously allocated XSQLDA used for results of statement execution;
if not required, set this value to NULL

Re[12]: interbase в Linux
От: Hiden  
Дата: 05.12.06 14:34
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Здравствуйте, Hiden, Вы писали:


T>
H>>check( isc_dsql_prepare(status_vector, &trans, &stmt, 0, str1, 1, sqlda));
H>>short i0 = 0, i1 = 0;
H>>sqlda->sqlvar[0].sqldata = (char *) &id;
H>>sqlda->sqlvar[0].sqltype = SQL_TEXT;
H>>sqlda->sqlvar[0].sqlind = &i0;

H>>sqlda->sqlvar[1].sqldata = (char *) &name;
H>>sqlda->sqlvar[1].sqltype = SQL_TEXT;
H>>sqlda->sqlvar[1].sqlind = &i1;

H>>check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, sqlda, NULL));
T>

T>У тебя нет входных параметров. Есть только выходные. Стало быть надо поменять местами 2 последних параметра, т.е:
T>
T>check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, NULL, sqlda));
T>


T>P.S. Открой доку по функции isc_dsql_execute2 и внимательно вчитайся в эти величественные строки:


T>

T>XSQLDA* in_xsqlda
T>Pointer to an optional, previously allocated XSQLDA used for input;
T>if input parameters are not supplied, set this value to NULL
T>

T>XSQLDA* out_xsqlda
T>Pointer to an optional, previously allocated XSQLDA used for results of statement execution;
T>if not required, set this value to NULL


Сделал как Вы сказали, немного изменил код:
...
int emp_no = 3;
char str1[BUFLEN];
isc_tr_handle trans = NULL;
long status[50];
sprintf(str1, "execute procedure sp %d;",emp_no);

check( isc_start_transaction(status_vector, &trans,1, &db, 0, 0) );
isc_stmt_handle stmt = NULL;

static char id[10], name[50];

check( isc_dsql_allocate_statement(status_vector, &db, &stmt));

XSQLDA *sqlda;
XSQLVAR *var;
sqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(2));
sqlda->sqln = 2;
sqlda->sqld = 2;
sqlda->version = 1;

check( isc_dsql_prepare(status_vector, &trans, &stmt, 0, str1, 1, NULL));
check( isc_dsql_describe(status_vector, &stmt, 1, sqlda));
int i;
for(i=0,var=(sqlda->sqlvar);i<(sqlda->sqld);i++,var++)
{
int dtype=(var->sqltype & ~1);
switch(dtype)
{
case SQL_VARYING:
var->sqltype = SQL_TEXT;
var->sqldata = (char*)malloc(sizeof(char)*var->sqllen + 2);
break;
case SQL_TEXT:
var->sqldata = (char*)malloc(sizeof(char)*var->sqllen);
break;
case SQL_LONG:
var->sqldata = (char*)malloc(sizeof(long));
break;
default:
break;
}
if(var->sqltype & 1)
{
var->sqlind = (short*)malloc(sizeof(short));
}
}

check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, NULL, sqlda));

ISC_STATUS fetch_stat;

while ((fetch_stat = isc_dsql_fetch(status_vector, &stmt, 1, sqlda)) == 0)
{
id[9] = '\0';
name[49] = '\0';
printf("\nid: %s", id);
printf("\nname: %s\n", name);
}
check( isc_dsql_free_statement(status_vector, &stmt, DSQL_drop));

check( isc_commit_transaction(status_vector, &trans) );
...
в хранимой процедуре у меня выходные параметры типа integer и varchar(20)

Ни как не могу понять, что теперь не так, теперь выдает такую ошибку
Dynamic SQL Error
-SQL error code =-804
-Incorrect values within SQLDA structure
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.