linux下c++远程连接oracle数据库

最近用c++在做linux下的oracle客户端远程连接数据库开发,遇到一个问题:我这样定义了一个游标EXECSQLdeclareemp_cursorcursorfors... 最近用c++在做linux下的oracle客户端远程连接数据库开发,遇到一个问题:
我这样定义了一个游标
EXEC SQL declare emp_cursor cursor for select name from admin;
char name[20];
EXEC SQL open emp_cursor ;
EXEC SQL fetch emp_cursor into :name;
从name里面能读到值
但是我想把结果放到一个复合类型里面,然后能按照顺序读
比如
EXEC SQL fetch emp_cursor into 复合类型;
复合类型.get(0)
这些代码我是写在.pc文件里面的,然后用Proc生成.cpp文件再进行编译
我猜想应该是在这里面定义一个复合类型变量
EXEC SQL BEGIN DECLARE SESSION;
//里面定义一个复合类型
EXEC SQL END DECLARE SESSION;
但我不知道怎么写
展开
 我来答
xpston008
2013-04-09 · TA获得超过365个赞
知道小有建树答主
回答量:367
采纳率:100%
帮助的人:348万
展开全部

你说的复合结构应该是结构体吧。 若是 举个例子给你看看 

/*
* sample2.pc
*
* This program connects to ORACLE, declares and opens a cursor,
* fetches the names, salaries, and commissions of all
* salespeople, displays the results, then closes the cursor.
*/
#include <stdio.h>
#include <sqlca.h>
#define UNAME_LEN 20
#define PWD_LEN 40
/*
* Use the precompiler typedef’ing capability to create
* null-terminated strings for the authentication host
* variables. (This isn’t really necessary--plain char *’s
* does work as well. This is just for illustration.)
*/
typedef char asciiz[PWD_LEN];
EXEC SQL TYPE asciiz IS STRING(PWD_LEN) REFERENCE;
asciiz username;
asciiz password;
struct emp_info
{
asciiz emp_name;
float salary;
float commission;
};
/* Declare function to handle unrecoverable errors. */
void sql_error();
main()
{
struct emp_info *emp_rec_ptr;
/* Allocate memory for emp_info struct. */
if ((emp_rec_ptr =
(struct emp_info *) malloc(sizeof(struct emp_info))) == 0)
{
fprintf(stderr, "Memory allocation error.\n");
exit(1);
}
/* Connect to ORACLE. */
strcpy(username, "SCOTT");
strcpy(password, "TIGER");
EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--");
EXEC SQL CONNECT :username IDENTIFIED BY :password;
printf("\nConnected to ORACLE as user: %s\n", username);
/* Declare the cursor. All static SQL explicit cursors
* contain SELECT commands. ’salespeople’ is a SQL identifier,
* not a (C) host variable.
*/
EXEC SQL DECLARE salespeople CURSOR FOR
SELECT ENAME, SAL, COMM FROM EMP WHERE JOB LIKE ’SALES%’;
/* Open the cursor. */
EXEC SQL OPEN salespeople;
/* Get ready to print results. */
printf("\n\nThe company’s salespeople are--\n\n");
printf("Salesperson Salary Commission\n");
printf("----------- ------ ----------\n");
/* Loop, fetching all salesperson’s statistics.
* Cause the program to break the loop when no more
* data can be retrieved on the cursor.
*/
EXEC SQL WHENEVER NOT FOUND DO break;
for (;;)
{
EXEC SQL FETCH salespeople INTO :emp_rec_ptr;
printf("%-11s%9.2f%13.2f\n", emp_rec_ptr->emp_name,emp_rec_ptr->salary, emp_rec_ptr->commission);
}
/* Close the cursor. */
EXEC SQL CLOSE salespeople;
printf("\nArrivederci.\n\n");
EXEC SQL COMMIT WORK RELEASE;
exit(0);
}
void sql_error(msg) char *msg;
{
char err_msg[512];
int buf_len, msg_len;
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("\n%s\n", msg);
/* Call sqlglm() to get the complete text of the
* error message.
*/
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
printf("%.*s\n", msg_len, err_msg);
EXEC SQL ROLLBACK RELEASE;
exit(1);
}
追问
用结构体的话事先得知道查询的字段数吧
我是想把查询做成一个接口
调用接口时sql查询的字段数未知
但是可以通过指定下标来获取该值
比如外部传入的sql语句为select id,name from 表
fetch 到 复合结构
复合结构.get(0)就是id的值
复合结构.get(1)就是name的值
(get方法是我自己臆测的一个获取值的方法,反正就是事先不知道查询的字段数,然后按下标取值)
追答
曾经有看过这样的方法。

用动态查询就可以实现了,不需要知道查询列表项和输入宿主变量的占位符个数
其实使用SQLDA 。

SQLDA就是你所说符合结构
struct SQLDA
{
long N; /* Descriptor size in number of entries */
char **V; /*Ptr to Arr of addresses of main variables */
long *L; /* Ptr to Arr of lengths of buffers */
short *T; /* Ptr to Arr of types of buffers */
short **I; /* Ptr to Arr of addresses of indicator vars */
long F; /* Number of variables found by DESCRIBE */
char **S; /* Ptr to Arr of variable name pointers */
short *M; /* Ptr to Arr of max lengths of var. names */
short *C; /* Ptr to Arr of current lengths of var. names */
char **X; /* Ptr to Arr of ind. var. name pointers */
short *Y; /* Ptr to Arr of max lengths of ind. var. names */
short *Z; /* Ptr to Arr of cur lengths of ind. var. names */
};

实例我没有环境 就不写了。
http://linux.sheup.com/linux/linux4026.htm
方法四
就是你想要的实现方式。

希望对你有帮助
御茹炜0G2
2013-04-08
知道答主
回答量:16
采纳率:0%
帮助的人:7.3万
展开全部
看看c++书再说!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式