Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1620657
  • 博文数量: 201
  • 博客积分: 2812
  • 博客等级: 少校
  • 技术积分: 3029
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-18 18:28
个人简介

从事数据库工作多年,目前看好分布式NeSQL/HTAP数据库在企业客户市场的发展。未来的主要方向是——致力于 NewSQL/HTAP 数据库的推广普及。

文章存档

2016年(1)

2015年(8)

2014年(23)

2013年(50)

2012年(32)

2011年(87)

分类: Sybase

2012-03-26 16:05:52

   最近遇到一个问题,用户希望使用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) |
给主人留下些什么吧!~~