1 2 /* 包含C头文件 */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <string.h> 6 7 /* 包含SQLCA头文件 */ 8 #include <sqlca.h> 9 10 /* 定义绑定变量值和 选择列表项值的最大长度 11 * 绑定变量:即在SQL语句中输入的“&”占位符。 12 */ 13 #define MAX_VAR_LEN 30 14 15 /* 定义选择列表项名的最大长度 */ 16 #define MAX_NAME_LEN 31 17 18 19 /* 定义宿主变量 */ 20 exec sql begin declare section; 21 char *usrname = "scott"; 22 char *passwd = "11"; 23 char *serverid = "orcl"; 24 char sql_stat[100]; 25 char current_date[20]; 26 exec sql end declare section; 27 28 void sql_error(void); 29 void connet(void); 30 void process_input(void); 31 void process_output(void); 32 33 int main(void) 34 { 35 /* 安装错误处理句柄 */ 36 exec sql whenever sqlerror do sql_error(); 37 38 /* 连接到数据库 */ 39 connet(); 40 41 /* 42 * 分配输入描述区和输出描述区 43 * Ansi定义了该套标准,proc程序开发者按标准实现了它 44 * 这两条语句在proc编译的时候会开辟对应大小的存储空间 45 */ 46 exec sql allocate descriptor 'input_descriptor'; //用来存储输入的宿主变量 47 exec sql allocate descriptor 'output_descriptor'; //用来缓存数据库端返回的结果集 48 49 for( ; ; ) 50 { 51 printf(" 请输入动态SQL语句(EXIT:退出): "); 52 gets(sql_stat); 53 54 /* EXIT(exit)->退出 */ 55 if(0 == strncmp(sql_stat , "EXIT" , 4) || 0 == strncmp(sql_stat , "exit" , 4)) 56 break; 57 58 /* 准备动态SQL语句 */ 59 exec sql prepare s from :sql_stat; 60 61 /* 定义游标 */ 62 exec sql declare c cursor for s; 63 64 /* 处理绑定变量 , 即处理占位符 “&” */ 65 process_input(); 66 67 /* 68 * 打开游标成功 意寓着结果已经被保存到输出描述区了。 69 * select语句:处理查询结果 70 * 其他SQL语句:执行 71 */ 72 exec sql open c using descriptor 'input_descriptor'; 73 if(0 == strncmp(sql_stat , "SELECT" , 6) , 0 == strncmp(sql_stat , "select" , 6)) 74 { 75 process_output(); 76 } 77 /* 关闭游标 */ 78 exec sql close c; 79 } 80 81 /* 释放输入描述区和输出描述区 */ 82 exec sql deallocate descriptor 'input_descriptor'; 83 exec sql deallocate descriptor 'output_descriptor'; 84 85 /* 提交事务,断开连接 */ 86 exec sql commit work release; 87 puts("谢谢使用ANSI动态SQL! "); 88 89 return 0; 90 } 91 92 void sql_error(void) 93 { 94 /* 显示SQL错误号、错误描述 */ 95 printf("%.*s " , sqlca.sqlerrm.sqlerrml , sqlca.sqlerrm.sqlerrmc); 96 exit(1); 97 } 98 99 void process_input(void) 100 { 101 int i; 102 103 /* 定义宿主变量 */ 104 exec sql begin declare section; 105 int input_count; 106 int input_type ; 107 int input_len; 108 char input_buffer[MAX_VAR_LEN]; 109 char name[MAX_NAME_LEN]; 110 int occurs; 111 exec sql end declare section; 112 113 /* 绑定变量->输入描述区 */ 114 exec sql describe input s using descriptor 'input_descriptor'; 115 116 /* 取得绑定变量个数 */ 117 exec sql get descriptor 'input_descriptor' :input_count = count; 118 119 /* 循环处理绑定变量名 */ 120 for(i = 0 ; i != input_count ; ++i) 121 { 122 occurs = i + 1; 123 124 /* 取得绑定变量名 */ 125 exec sql get descriptor 'input_descriptor' value :occurs :name = name; 126 printf("请输入%s的值:" , name); 127 gets(input_buffer); 128 129 /* 以NULL结尾 */ 130 input_len = strlen(input_buffer); 131 input_buffer[input_len] = '