PRO*C 函数事例 2 -- 数据库操作

Pro*C Oracle 的嵌入式开发,数据库处理部分最好能提取到一个模块,按照对不同数据库表的操作分成不同的.pc文件(如 DbsInstStat.pc)。
将此模块编译成库(c文件编译时链接此库),.c文件处理库表时调用对应数据库模块(.pc)中的函数即可。
      函数事例:

DbsDef.h

#define DBS_INIT       0
#define DBS_SELECT     1
#define DBS_LOCK       2
#define DBS_UPDATE     3
#define DBS_DELETE     4
#define DBS_INSERT     5

#define DBS_CURSOR     11
#define DBS_OPEN       12
#define DBS_CLOSE      13
#define DBS_FETCH      14

#define DBS_UPDATE2    15

#define  SQL_NOT_FOUND_RET(ERR_VAL)     if( sqlca.sqlcode == 1403 )     {        HtLog( ERROR , "error code [%d], reason[%s] \n",             sqlca.sqlcode, ( char * )sqlca.sqlerrm.sqlerrmc ) ;         strcpy( gPubStru.saBankRespCode, ERR_VAL ) ;         return -1;     }

#define  SQL_ERR_RET( )     if( sqlca.sqlcode != 0 )     {        HtLog( ERROR , "SQL ERROR code [%d], reason[%s] \n",             sqlca.sqlcode, ( char * )sqlca.sqlerrm.sqlerrmc );         strcpy( gPubStru.saBankRespCode, SQL_ERR ) ;         return -1 ;     }

#define  SQL_ERR_RET2( )     if( sqlca.sqlcode != 0 && sqlca.sqlcode != 1403)     {        HtLog( ERROR , "SQL ERROR code [%d], reason[%s] \n",             sqlca.sqlcode, ( char * )sqlca.sqlerrm.sqlerrmc );         strcpy( gPubStru.saBankRespCode, SQL_ERR ) ;         return -1 ;     }

DbsInstStat.pc

#include "public.h"
#include "errlog.h"
#include "DbsDef.h"
#include "my_sys.h"

EXEC SQL INCLUDE sqlda;
EXEC SQL INCLUDE sqlca;

EXEC SQL BEGIN DECLARE SECTION;
    char    saInstCode[11 + 1];
    char    saInstHsmIndex [3 + 1];
    char    saInstPrimKey [32 + 1];
    char    saInstPinKey [32 + 1];
    char    saInstMacKey [32 + 1];
    char    saInstStat [1 + 1];
EXEC SQL END DECLARE SECTION;

int DbsTblInstStat (int nOpr)
{
    /***********
    * 参数初始化
    ************/
    memset (saInstCode, 0x00, sizeof(saInstCode));
    memset (saInstHsmIndex, 0x00, sizeof(saInstHsmIndex));
    memset (saInstPrimKey, 0x00, sizeof(saInstPrimKey));
    memset (saInstPinKey, 0x00, sizeof(saInstPinKey));
    memset (saInstMacKey, 0x00, sizeof(saInstMacKey));
    memset (saInstStat, 0x00, sizeof(saInstStat));

    memcpy (saInstCode, gPubStru.saFwdInstIdCode, 8);
    trimspace (saInstCode);

    /***********
    * 数据处理
    ************/
    switch (nOpr)
    {
    case DBS_SELECT:
        EXEC SQL
            SELECT INST_HSM_INDEX, INST_PRIM_KEY, nvl(INST_PIN_KEY, ‘ ‘), nvl(INST_MAC_KEY, ‘ ‘), INST_STAT
            INTO :saInstHsmIndex, :saInstPrimKey, :saInstPinKey, :saInstMacKey, :saInstStat
            FROM TBL_INST_STAT
            WHERE INST_CODE = :saInstCode;

            SQL_NOT_FOUND_RET2 ( );
            SQL_ERR_RET2 ( );

        /******************
        * 保存数据到内部IPC
        *******************/
        memcpy (gPubStru.saInstHsmIndex, saInstHsmIndex, 4);
        memcpy (gPubStru.saInstMainKey, saInstPrimKey, 32);
        memcpy (gPubStru.saPinKey, saInstPinKey, 32);
        memcpy (gPubStru.saMacKey, saInstMacKey, 32);
        memcpy (gPubStru.saInstStat, saInstStat, 1);

        break;
    case DBS_UPDATE:
        EXEC SQL
            UPDATE TBL_INST_STAT SET INST_STAT = ‘Y‘
            WHERE INST_CODE = :saInstCode;

            SQL_NOT_FOUND_RET2 ( );
            SQL_ERR_RET2( )

        break;
    case DBS_UPDATE2:
        memcpy (saInstMacKey, gPubStru.saMacKey1, 16);

        EXEC SQL
            UPDATE TBL_INST_STAT SET INST_MAC_KEY = :saInstMacKey
            WHERE INST_CODE = :saInstCode;

            SQL_NOT_FOUND_RET2 ( );
            SQL_ERR_RET2( )

        break;
    default:
        break;
    }

    return 0;
}
时间: 2024-08-11 07:40:27

PRO*C 函数事例 2 -- 数据库操作的相关文章

PRO*C 函数事例 3 -- 游标使用

1.Oracle中的游标    Oracle使用两种游标: 显式游标和隐式游标. 不管语句返回多少条记录, Oracle为每条使用的SQL语句隐式地定义一个游标. Oracle为每个DELETE , UPDATE, INSERT 等SQL命令隐式地声明游标. 用户声明并使用显式游标处理SELECT语句返回的多条记录.    游标是ORACLE和PRO*C存放查询结果的工作区域.一个游标(已命名的)与一条SELECT语句相关联.操作游标有由4条命令:(1)DECLARE CURSOR:(2)OPE

PRO*C 函数事例 1 -- 数据库连接、事务处理

1.程序结构        每一个Pro*C程序都包括两部分:(1)应用程序首部:(2)应用程序体        应用程序首部定义了ORACLE数据库的有关变量, 为在C语言中操纵ORACLE数据库做好了准备.应用程序体基本上由Pro*C的SQL语句调用组成.主要指查询SELECT.INSERT.UPDATE.DELETE等语句.        应用程序的组成结构如图所示:       2.函数事例 EXEC SQL INCLUDE sqlca ; #include "my_sys.h"

CI框架常用函数(AR数据库操作的常用函数)

用户手册地址:http://codeigniter.org.cn/user_guide/index.html 1.查询表记录$this->db->select(); //选择查询的字段$this->db->select_max();$this->db->select_min();$this->db->select_avg();$this->db->select_sum();$this->db->from(); //选择表名$this-

一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER

最近做了一个数据诊断的项目,里面自己写了一个数据库的操作类,包含:连接数据库.读数据表.执行SQL操作,释放数据库等组成,希望对大家有用,由于水平有限,若有错误或者代码不足地方欢迎指正,谢谢. ADOOperate.H [cpp] view plaincopy ////////////////////////////////////////////////////////////////////// // 类功能:用于数据库的操作 主要实现 连接数据库 读数据表 检查数据表 执行SQL语句 //

Python学习—数据库操作

python2中操作数据库:MySQLdbpython3中操作数据库:pymysql python接连数据库 1.创建数据库连接: mysql.connect()函数 2.执行数据库操作:执行数据库操作,我们要使用连接对象获得一个cursor(游标)对象: 用连接对象的cursor()方法返回一个游标对象 接下来,我们会使用cursor提供的方法来进行工作. 这些方法包括两大类:1.执行命令,2.接收返回值 执行命令: callproc(self, procname, args):用来执行存储过

thinkphp对数据库操作有哪些内置函数

原文:thinkphp对数据库操作有哪些内置函数 getModelName() 获取当前Model的名称 getTableName() 获取当前Model的数据表名称 switchModel(type,vars=array()) 动态切换模型 table() 设置当前操作的数据表 field() 设置要查询的数据字段 where() 设置查询或者操作条件 data(data) 设置数据对象 order(order) 设置排序 limit(limit) 查询限制 page(page) 查询分页 j

CI框架的数据库操作函数

//举例查询 (userid,name,sex为user表的数据库字段)    public function testa(){        $this->load->database();            $query = $this->db->query('SELECT * FROM user');        foreach ($query->result() as $row)        {            echo $row->userid;

ecshop数据库操作函数

ecshop数据库操作函数 分类: ecshop和dede2013-09-23 14:02 1716人阅读 评论(0) 收藏 举报 本章我们将结合eschop二次开发一些常见的开发例子.来谈谈ecshop的数据库类和方法是如何处理数据库.让我们熟练掌握ecshop数据库的操作. 1:ecshop的数据库类实例子化对象为$db;表的实例化对象为$ecs 2:如何取得ecshop某个表中多行数据.该使用方法getAll() $res =$db -> getAll(); 3:如何取得ecshop某一行

WordPress数据库操作函数详解

通过这个$wpdb对象,我们可以对WordPress数据库进行任何操作,包括建表.查询.删除.更新等.要注意的是,如果要在自定义函数中使用$wpdb,必须先将其全局化(global $wpdb;). 下面就详细介绍一下WordPress的数据库操作函数: 1.function query($query) 这个函数是最基本的数据库操作函数,$query为SQL语句,提交给数据库执行,结果分两种情况: 1). 如果是"insert|delete|update|replace", 返回受影响