最近遇到一个问题,用户希望使用Sybase Open Client E-SQL/C调用IQ中的存储过程,并且在E-SQL/C应用中能够显示出存储过程中用print语句打印出的消息,以便于调试。这种使用E-SQL/C的方式,就好像是把IQ Server当成是一个ASE Server一样。
那如何做到这样的支持呢?本文通过一个例子说明实现方法。
1. 编写示例存储过程
create procedure sp_test1
as
begin
declare @execString char(100)
select @execString = 'execute select 1'
print '[%1!]',@execString
select @execString = 'execute select 2'
print '[%1!]',@execString
select @execString = 'execute select 3'
print '[%1!]',@execString
end
说明:上面的存储过程很简单,不过说明问题已经总够了。
2. 编写E-SQL/C示例程序demo2.cp
/*下面是程序的源码*/
#include
#include "sybsqlex.h"
/* Declare the SQLCA. */
EXEC SQL INCLUDE SQLCA;
void error_handler();
void warning_handler();
void get_proc_print_info();
int main(int argc, char *argv[])
{
EXEC SQL BEGIN DECLARE SECTION;
char username[30];
char password[30];
EXEC SQL END DECLARE SECTION;
EXEC SQL WHENEVER SQLERROR CALL error_handler();
EXEC SQL WHENEVER SQLWARNING CALL warning_handler();
EXEC SQL WHENEVER NOT FOUND CONTINUE;
strcpy(username, USER);
strcpy(password, PASSWORD);
EXEC SQL CONNECT :username IDENTIFIED BY :password;
EXEC SQL EXEC sp_test1 ;
get_proc_print_info();
EXEC SQL DISCONNECT DEFAULT;
return(STDEXIT);
}
void get_proc_print_info()
{
exec sql begin declare section;
int num_msgs;
int condcnt;
exec sql include sqlca;
exec sql end declare section;
/*
** 通过下面的代码可以得到存储过程中print语句输出消息.
*/
exec sql get diagnostics :num_msgs = number;
for (condcnt=1; condcnt <= num_msgs; condcnt++)
{
exec sql get diagnostics exception :condcnt :sqlca = sqlca_info;
printf("message length:%d message text:%s\n", sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
}
}
void
error_handler(void)
{
fprintf(stderr, "\n** SQLCODE=(%ld)", sqlca.sqlcode);
if (sqlca.sqlerrm.sqlerrml)
{
fprintf(stderr, "\n** SQL Server Error ");
fprintf(stderr, "\n** %s", sqlca.sqlerrm.sqlerrmc);
}
return;
//exit(ERREXIT);
}
void
warning_handler(void)
{
if (sqlca.sqlwarn[1] == 'W')
{
fprintf(stderr,
"\n** Data truncated.\n");
}
if (sqlca.sqlwarn[3] == 'W')
{
fprintf(stderr,
"\n** Insufficient host variables to store results.\n");
}
return;
}
说明:
(1) 在调用存储过程,即 EXEC SQL EXEC sp_test1 之后,立即调用红色字体标识的函数get_proc_print_info();
(2) 在get_proc_print_info()函数中,使用 get diagnostics E-SQL/C命令获取Server返回的消息(包括print语句的输出)
阅读(4372) | 评论(0) | 转发(0) |