Oracle pro*cc++动态sql(方法三示例)

it2024-03-23  71

方法三

方法三

这种方法可以包含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); }
最新回复(0)