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

来源:互联网 发布:数控编程调用子程序 编辑:程序博客网 时间:2024/06/14 07:13
 
#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
原创粉丝点击