主题中提到的三种语句都是没有返回值的,所以我们实现起来也最简单,下面代码中包含了 insert、update 和 delete 三种语法的使用。值得注意的是在 insert 和 update 的时候使用宿主变量时的语法,在宿主变量前一定要加冒号,这是初学者最容易犯的错误。
代码实现
#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 的数据被我们删除了。