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 的数据被我们删除了。

发表评论