方法三
这种方法可以包含select查询语句,但是处理选择列表项(select查询出来的结果列数固定) 和 输入宿主变量个数一定。可以理解为:
1.输入宿主变量个数固定 查询条件固定
2.输出宿主变量个数固定 返回结果固定
可以结合游标使用
- demo3
查询部门号等于**的信息
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sqlca.h"
#include "oraca.h"
typedef char mydname[20];
typedef char myloc[20];
extern sqlgls(char * , size_t *, size_t * );
extern sqlglmt(void *,char *,size_t *,size_t *);
//定义宿主变量
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL TYPE mydname is string(20);
EXEC SQL TYPE myloc is string(20);
char *logname = "c##cott";
char *pwd = "root";
char *serverid = "c##scott/root";
int deptno;
mydname dname;
myloc loc;
//指示变量
short dname_ind;
short loc_ind;
char mySql[512];
char *pSql;
EXEC SQL END DECLARE SECTION;
int connet();
void doerr();
int main()
{
int ret = 0;
char inputchar;
memset(mySql, 0, sizeof(mySql));
pSql = NULL;
EXEC SQL WHENEVER SQLERROR DO doerr();
connet();
//循环处理sql语言
for(;;)
{
printf("\n请输入查询的部门编号 ");
scanf("%d", &deptno);
//准备动态sql
EXEC SQL PREPARE my_pre FROM 'select deptno, dname, loc from dept where deptno =:a';
//定义游标
EXEC SQL DECLARE mycursor CURSOR FOR my_pre;
//打开游标
EXEC SQL OPEN mycursor USING :deptno;
//提取数据
EXEC SQL WHENEVER NOT FOUND DO break; //==错误号if (1403 ||| 1000)
for (;;)
{
EXEC SQL FETCH mycursor INTO :deptno, :dname,:loc:loc_ind;
printf("%d\t %s\t %s \n", deptno, dname, loc);
}
EXEC SQL CLOSE mycursor;
EXEC SQL COMMIT;
printf("\n键入 n 退出, 其他继续? ");
scanf("%c", &inputchar);
fflush(stdin);
if (inputchar=='n' || inputchar=='N')
{
break;
}
}
EXEC SQL COMMIT WORK RELEASE;
return ret ;
}
int connet()
{
int ret = 0;
//连接数据库
EXEC SQL connect :serverid;
if (sqlca.sqlcode != 0)
{
ret = sqlca.sqlcode;
}
else
{
printf("connect ok...\n");
}
return ret;
}
void doerr()
{
char szerrbuf[120];
size_t outputlen, inputlen = 120;
unsigned int ret = 0;
//出错时,可以把错误SQL语言给打印出来
EXEC SQL WHENEVER SQLERROR CONTINUE;
ret = sqlgls(szerrbuf, &inputlen, &outputlen);
printf("SQL:%.*s\n", inputlen, szerrbuf);
printf("提示:%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
}