您的位置:首页 > 编程语言

Pro*C中调用存储过程的示例代码

2008-10-09 20:46 447 查看
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
#include <sqlda.h>
#include <sqlcpr.h>

#define NAME_LEN 30

VARCHAR username/[NAME_LEN];
VARCHAR password/[NAME_LEN];
VARCHAR database/[NAME_LEN];

/* the cursor variable */
SQL_CURSOR emp_cursor;

/* used to strip blanks from the ename and job */
typedef char asciiz/[NAME_LEN];
EXEC SQL TYPE asciiz IS STRING(NAME_LEN) REFERENCE;

int    empno;
asciiz ename;
asciiz job;

void sql_error(char *msg)
{
char err_msg/[128];
size_t buf_len, msg_len;

EXEC SQL WHENEVER SQLERROR CONTINUE;

printf("/n%s/n", msg);
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
printf("%.*s/n", msg_len, err_msg);

EXEC SQL ROLLBACK RELEASE;

exit(EXIT_FAILURE);
}

void main()
{
strncpy((char *) username.arr, "SCOTT", NAME_LEN);
username.len = (unsigned short) strlen((char *) username.arr);

strncpy((char *) password.arr, "TIGER", NAME_LEN);
password.len = (unsigned short) strlen((char *) password.arr);

strncpy((char *) database.arr, "OTNDEMO", NAME_LEN);
database.len = (unsigned short) strlen((char *) database.arr);

EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error: /n");

EXEC SQL CONNECT :username IDENTIFIED BY :password USING :database;

printf("/nConnected to %s as user: %s/n/n", database.arr, username.arr);

/* allocate cursor variable */
EXEC SQL ALLOCATE :emp_cursor;

/* call the stored procedure */
EXEC SQL EXECUTE
BEGIN
get_emp_info(p_rc => :emp_cursor);
END;
END-EXEC;

EXEC SQL WHENEVER NOT FOUND DO break;

for (;;)
{
EXEC SQL FETCH :emp_cursor INTO :empno, :ename, :job;

printf("EMPNO: %d, ENAME: %s, JOB: %s/n", empno, ename, job);
}

/* close and free the cursor */
EXEC SQL CLOSE :emp_cursor;

EXEC SQL FREE :emp_cursor;

EXEC SQL COMMIT RELEASE;

exit(EXIT_SUCCESS);
}

编译指令:
(Windows)
proc parse=full sqlcheck=semantics userid=scott/tiger refcur.pc
cl /O2 /Ot /MD refcur.c /link orasql10.lib
输出结果:
D:/My Projects/C/ProC/refcur>refcur
Connected to OTNDEMO as user: SCOTT
EMPNO: 7876, ENAME: ADAMS, JOB: CLERK
EMPNO: 7499, ENAME: ALLEN, JOB: SALESMAN
EMPNO: 7698, ENAME: BLAKE, JOB: MANAGER
EMPNO: 7782, ENAME: CLARK, JOB: MANAGER
EMPNO: 7902, ENAME: FORD, JOB: ANALYST
EMPNO: 7900, ENAME: JAMES, JOB: CLERK
EMPNO: 7566, ENAME: JONES, JOB: MANAGER
EMPNO: 7839, ENAME: KING, JOB: PRESIDENT
EMPNO: 7654, ENAME: MARTIN, JOB: SALESMAN
EMPNO: 7934, ENAME: MILLER, JOB: CLERK
EMPNO: 7788, ENAME: SCOTT, JOB: ANALYST
EMPNO: 7369, ENAME: SMITH, JOB: CLERK
EMPNO: 7844, ENAME: TURNER, JOB: SALESMAN
EMPNO: 7521, ENAME: WARD, JOB: SALESMAN
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: