主题中提到的三种语句都是没有返回值的,所以我们实现起来也最简单,下面代码中包含了 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

执行效果

表中的原有如下数据: 2015-07-24_162304 执行我们的程序(注意,在程序执行前,你要操作的数据必须都是真正提交到数据库中的,如果操作了未commit的数据,那么程序就会卡住不动): 2015-07-24_163039 执行后再次查看数据库: 2015-07-24_163010 多了一条 deptno = 60 的数据,而原来 deptno = 50 的数据被我们删除了。