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 ; !!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.