proc 编程执行insert、delete、update语句

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

评论