转载:http://blog.sina.com.cn/s/blog_6cc7e1e10100ylo3.html
PROC是ORACLE数据库提供的编程接口之一,其应用十分的广泛,本文通过一个具体的例子,介绍PROC编程的一些经验及应注意的地方。
// oracle数据库环境设置
[root@localhost test]# export ORACLE_BASE=/u01/app/oracle
[root@localhost test]# export ORACLE_HOME=/u01/app/oracle/oracle/product/10.2.0/db_1
[root@localhost test]# export ORACLE_SID=testDB
[root@localhost test]# export PATH=$PATH:/u01/app/oracle/oracle/product/10.2.0/db_1/bin
[root@localhost test]# export LD_LIBRARY_PATH=/u01/app/oracle/oracle/product/10.2.0/db_1/lib
// oracle服务开启
$ lsnrctl start #启动监听器, 监听器接受客户端的连接请求
$ emctl start dbconsole #启动 Oracle Enterprise Manager 数据库控制
$ isqlplusctl start #启动和停止 iSQL*Plus
// 文件名: main.pc
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlda.h>
#include <sqlcpr.h>
EXEC SQL INCLUDE sqlca;
//RELEASE_CURSOR=YES 使PROC 在执行完后释放与嵌入SQL有关资源
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
// 申明宿主变量
EXEC SQL BEGIN DECLARE SECTION;
varchar vc_user[30];
long userid=0;
char username[51]="";
EXEC SQL VAR username IS STRING(51);
EXEC SQL END DECLARE SECTION;
void sql_error(char *msg)
{
printf("\n%s,%ld,%s\n", msg,sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELEASE;
exit(-1);
}
int main(int argc,char* argv[])
{
EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE ERROR: ");
// 连接数据库
const char* conn = "user/pass@testDB";
strcpy(vc_user.arr,conn);
vc_user.len=strlen(conn);
exec sql connect :vc_user;
// 测试插入语句
EXEC SQL INSERT INTO TESTDEMO(ID,NAME) VALUES(3,'haoj');
// 利用游标循环取值
EXEC SQL DECLARE cur_user CURSOR FOR SELECT ID, NAME FROM TESTDEMO;
EXEC SQL OPEN cur_user;
while(1){
userid=0;
strcpy(username,"");
EXEC SQL FETCH cur_user INTO :userid, :username;
if( sqlca.sqlcode == 1403) break;
printf("userid=%ld,username=%s\n",userid,username);
}
EXEC SQL CLOSE cur_user;
// EXEC SQL COMMIT WORK RELEASE;
EXEC SQL ROLLBACK WORK RELEASE;
return 0;
}
// 文件名: Makefile
OBJS=main.o