主题中提到的三种语句都是没有返回值的,所以我们实现起来也最简单,下面代码中包含了 insert、update 和 delete 三种语法的使用。值得注意的是在 insert 和 update 的时候使用宿主变量时的语法,在宿主变量前一定要加冒号,这是初学者最容易犯的错误。
代码实现
代码语言:javascript复制#include <stdio.h>
#include <string.h>
#include “sqlca.h”
EXEC SQL BEGIN DECLARE SECTION;
char *serversid = "scott/tiger@orcl";
// 宿主变量
int deptno;
char dname[20];
char loc[10];
char newname[20];
char newloc[10];
EXEC SQL END DECLARE SECTION;
int main(int argc, char* argv[])
{
int ret = 0;
// 连接 oracle 服务器
EXEC SQL CONNECT :serversid;
if (sqlca.sqlcode != 0)
{
ret = sqlca.sqlcode;
printf("connect oracle error... code = %d\n", ret);
return ret;
}
// 插入数据
deptno = 60;
strcpy(dname, "dengjia");
strcpy(loc, "hello");
// 请注意插入数据时使用宿主变量的语法
EXEC SQL insert into dept(deptno, dname, loc) values(:deptno, :dname, :loc);
if (sqlca.sqlcode != 0)
{
ret = sqlca.sqlcode;
printf("insert into error... code = %d\n", ret);
return ret;
}
// 更新数据
strcpy(newname, "mynewname");
strcpy(newloc, "mynewloc");
// update 数据时使用宿主变量的语法,更新 deptno 为 60 的数据
EXEC SQL update dept set dname = :newname, loc = :newloc where deptno = 60;
if (sqlca.sqlcode != 0)
{
ret = sqlca.sqlcode;
printf("update set error... code = %d\n", ret);
return ret;
}
printf("update success...\n");
// 对上面执行的操作执行一次提交
EXEC SQL commit;
// 删除 dept 表中 deptno 为 50 的数据
EXEC SQL delete from dept where deptno = 50;
if (sqlca.sqlcode != 0)
{
ret = sqlca.sqlcode;
printf("delete from error... code = %d\n", ret);
return ret;
}
printf("delete success...\n");
EXEC SQL commit release;
return 0;
}
代码编译
proc 预处理:proc insert.pc gcc 编译:gcc insert.c -o insert -I ORACLE_HOME/precomp/public -L ORACLE_HOME/lib -l clntsh
执行效果
表中的原有如下数据:
执行我们的程序(注意,在程序执行前,你要操作的数据必须都是真正提交到数据库中的,如果操作了未commit的数据,那么程序就会卡住不动):
执行后再次查看数据库:
多了一条 deptno = 60 的数据,而原来 deptno = 50 的数据被我们删除了。