关于ORACLE blob图片文件的写入

Oracle BLOB图片文件存储详解
该博客介绍了如何在Oracle数据库中存储BLOB类型的图片文件。通过使用C语言的OCI库,详细阐述了从将图片转换为unsigned char数组,到利用proc进行数据插入的过程,特别是插入时使用EMPTY_BLOB()占位,然后写入二进制流的方法。

写入图片文件先要1  将图片写入到unsigned char数组

2  插入empty_blob()

3 再插入图片

int readjpg(char *filename, byte* picbuff, unsigned int *amt)
{
    /*组合完整路径*/
    int ret = 0;
    int filesize = 0;
    char *path = getenv("PICDIR");
    char fullpath[100];
    memset(fullpath, 0, sizeof(fullpath));
    strcpy(fullpath, path);
    strcat(fullpath, "/");
    strcat(fullpath, filename);
    /*1 判断有无图片*/
    FILE* fpic = NULL;
    fpic  = fopen(fullpath, "rb");
    if(NULL == fpic)
    {
        BASLOG(LOG_LEVEL_ERROR, "[%s]文件打不开", fullpath);
        return FAILURE;
    }
    /*获取文件大小*/
    fseek(fpic, 0, SEEK_END);
    filesize=ftell(fpic);
    fseek(fpic, 0, SEEK_SET);
    /*判断文件大小是否超过限制*/
    if(filesize > PICMAX)
    {
        BASLOG(LOG_LEVEL_ERROR, "[%s]大小[%d]超过[%d]!", fullpath, filesize, PICMAX);
        return FAILURE;
    }
    /*读取文件到数组*/
    ret = fread(picbuff, sizeof(byte), PICMAX, fpic);

2 插入数据库用的是proc

*******************************************************************************/
#include <string.h>
#include "ums_dbs.h"
#include <oci.h>
#define PICTUREMAX  5*1024*1024
OCIBlobLocator *blob;
EXEC SQL INCLUDE SQLCA;
EXEC SQL INCLUDE "apptbldef.h";




/********************************************************************
 * 函数名称:    dbsInfcardrec
 * 函数描述:    根据参数iDbOprType,申请制卡记录表进行操作
 * 输入参数:    int iDbOprType                        数据表操作标志
 *              t_inf_card_rec_def   *pt_inf_card_rec_def        表结构体

amt 图片大小 picbuff图片二进制流数组
 * 输出参数:
 * 返回值  :
 *          0:  成功
 *          Other: 失败
 * 调用者  :
 ********************************************************************/


int dbsInfcardrec(iDbOprType,pt_inf_card_rec_def,pStrSql, picbuff, amt)
EXEC SQL BEGIN DECLARE SECTION;
    int iDbOprType;
    t_inf_card_rec_def *pt_inf_card_rec_def;
    char *pStrSql;
    unsigned char* picbuff;
    unsigned int amt;
EXEC SQL END DECLARE SECTION;
{
    switch (iDbOprType)
    {
        case DBS_SELECT   :   /*根据身份证号查询数据表信息*/
            EXEC SQL Select id_no INTO :pt_inf_card_rec_def->id_no From t_inf_card_rec
                Where CARD_NO =:pt_inf_card_rec_def->id_no;
            if (sqlca.sqlcode == 1405 || sqlca.sqlcode == -1405)
                sqlca.sqlcode = 0;
            if (sqlca.sqlcode == 1403 || sqlca.sqlcode == -1403)
            {
                    sqlca.sqlcode = ORA_NO_DATA_FOUND;
            }
            break;
        case DBS_INSERT   :   /*插入数据表信息 因为有blob类型数据所以跟一般的数据插入不一样*/
            EXEC SQL ALLOCATE :blob;
            EXEC SQL VAR picbuff IS RAW(PICTUREMAX);
            EXEC SQL Insert Into t_inf_card_rec Values (
            :pt_inf_card_rec_def->list_no,
            :pt_inf_card_rec_def->id_no,
            :pt_inf_card_rec_def->name,
            '2',
            null,
            EMPTY_BLOB(),
            '19470206',
            '18980050711',
            null,
            null,
            '1',
            '1',
            '01',
            null,
            '01',
            '07',
            EMPTY_BLOB(),
            null,
            null,
            null,
            '20170223',
            null,
            null,
            null,
            '1',
            '20170223160558',
            null,
            '20170223160558',
            '1',
            '20170223160558',
            '20170223',
            null,null,
            '02',
            '20170223',
            null,
            null,
            '20170223160558',
            '1',
            EMPTY_BLOB(),
            '1',
            null,
            null)  RETURNING picture INTO :blob;
            if (sqlca.sqlcode == 1 || sqlca.sqlcode == -1)
                sqlca.sqlcode = ORA_UNIQUE_VIOLATED;//返回一个位置插入图片
            EXEC SQL LOB WRITE ONE :amt   //插入二进制流图片
           FROM :picbuff INTO :blob;
            break;
        default:
            return -1;
    }
    return sqlca.sqlcode;
}
  

参考了https://www.csee.umbc.edu/portal/help/oracle8/server.815/a68022/lob.htm#1001868

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值