【原创】OCILIB操作bfile字段

1、目录知识

(1)、基于服务端 vs 基于客户端

文件的路径都是相对于服务端目录的路径。

(2)、如何创建一个目录对象?

为了创建目录,必须具有DBA角色或者赋予了CREATE ANY DIRECTORY权限。

示例:

Window平台

CONNECT system/manager 

CREATE OR REPLACE DIRECTORY my_dir as ‘D:\DataPump‘; 

CREATE OR REPLACE DIRECTORY my_logdir as ‘E:\logs‘; 

GRANT read, write ON DIRECTORY my_dir TO scott; 

GRANT read, write ON DIRECTORY my_logdir TO scott;

Unix平台

CONNECT system/manager 

GRANT CREATE ANY DIRECTORY TO scott; 

CONNECT scott/tiger 

CREATE OR REPLACE DIRECTORY my_dir as ‘/usr/DataPump‘; 

CREATE OR REPLACE DIRECTORY my_logdir as ‘/usr/logs‘;

如果普通用户被赋予了CREATE ANY DIRECTORY权限,那么用户就自动具备目录的READ和WRITE权限。

注意:CREATE DIRECTORY语句不会创建磁盘的真实目录,如果目录是无效的,数据泵作业会报错:

ORA-39002: invalid operation 

ORA-39070: Unable to open the log file. 

ORA-29283: invalid file operation 

ORA-06512: at "SYS.UTL_FILE", line 475 

ORA-29283: invalid file operation

(3)、如何查询可用的目录?

可以使用如下SQL查询具有READ和WRITE权限的目录:

SELECT directory_name, grantee, privilege 

FROM user_tab_privs t, all_directories d 

WHERE t.table_name(+)=d.directory_name   

ORDER BY 1,2,3;

2、建测试表

create table bfile_test

(

code number(6),

value bfile

)

3、代码(由ocilib demo增加注释而来)

#include "ocilib.h"

int main(void)
{
    OCI_Connection *cn;
    OCI_Statement *st;
    OCI_Resultset *rs;
    OCI_File *file;
    char buffer[256];
    int n;

     if (!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT | OCI_ENV_CONTEXT))
    {
        printf("Error OCI_Initialize\n");
        return -1;
    }

    cn = OCI_ConnectionCreate("hisd", "ha2", "peidian", OCI_SESSION_DEFAULT);
    if (!cn)
    {
        printf("Error OCI_ConnectionCreate\n");
        return -1;
    }

    st = OCI_StatementCreate(cn);
    if (!st)
    {
        printf("Error OCI_StatementCreate\n");
        return -1;
    }

    file = OCI_FileCreate(cn, OCI_CFILE);
    if (!file)
    {
        printf("Error OCI_FileCreate\n");
        return -1;
    }

    if (!OCI_FileSetName(file, "MYDIR", "bbbb.txt"))
    {
        printf("Error OCI_FileSetName\n");
        return -1;
    }

    /* check if faile exists */
    if (OCI_FileExists(file))
    {
         printf("file size : %d\n", OCI_FileGetSize(file));
         printf("file dir  : %s\n", OCI_FileGetDirectory(file));
         printf("file name : %s\n", OCI_FileGetName(file));
    }else
    {
        printf("Error OCI_FileExists\n");
        return -1;
    }

    /* bind for inserting into table */

    if(!OCI_Prepare(st, "insert into BFILE_TEST(code, value) values (1, :bfile)"))
    {
        printf("Error OCI_Prepare\n");
        return -1;
    }

    if(!OCI_BindFile(st, ":bfile", file))
    {
        printf("Error OCI_BindFile\n");
        return -1;
    }

    if(!OCI_Execute(st))
    {
        printf("Error OCI_Execute\n");
        return -1;
    }

    if(!OCI_Commit(cn))
    {
        printf("Error OCI_Commit\n");
        return -1;
    }

    /* free local file object */

    OCI_FileFree(file);

     printf("insert OK\n");

#if 0
    /* fetch bfile data from table */
    OCI_ExecuteStmt(st, "select code, value from BFILE_TEST");
    rs = OCI_GetResultset(st);
    while (OCI_FetchNext(rs))
    {
        file = OCI_GetFile(rs, 2);

        OCI_FileOpen(file);

        printf("file size  %d\n", OCI_FileGetSize(file));
        printf("file dir   %s\n", OCI_FileGetDirectory(file));
        printf("file name  %s\n", OCI_FileGetName(file));

        while (n = OCI_FileRead(file, buffer, sizeof(buffer)-1))
        {
            buffer[n] = 0;
            printf(buffer);
        }

        OCI_FileClose(file);
    }

    OCI_Cleanup();
#endif

    return EXIT_SUCCESS;
}
时间: 2024-10-12 03:14:59

【原创】OCILIB操作bfile字段的相关文章

oracle 下操作blob字段是否会产生大量redo

操作blob字段是否会产生大量redo,答案是不会.以下来做一个实验,測试数据库版本号是11.2.0.1.0: --创建一张表做測试之用 create table test_blob ( id number, tupian blob ); import java.io.FileInputStream; import java.io.OutputStream; import java.sql.Connection; import java.sql.DriverManager; import jav

Mysql字段操作—增加字段、删除字段、修改字段名、修改字段类型(约束条件) 【转】

1.增加字段:    alter table   tablename    add   new_field_id   type   not null default '0';     例:     alter table mmanapp_mmanmedia add appid_id integer not null default 372; 增加主键: alter table  tabelname   add   new_field_id   type    default 0 not null

crm操作安全字段

using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; /// <summary> /// 安全字段 /// </summary> public class FieldSecurityProfileHelper { public static readonly string entityName = "fieldsecurityprofile"; public static

mysql数据表的基本操作:表结构操作,字段操作

本节介绍: 表结构操作 创建数据表. 查看数据表和查看字段. 修改数据表结构 删除数据表 字段操作 新增字段. 修改字段数据类型.位置或属性. 重命名字段 删除字段 首发时间:2018-02-18  21:31 表结构操作 创建数据表: 语法  : create table [if not exists] 表名( 字段名字 数据类型, 字段名字 数据类型 )[表选项]; 表选项  : 字符集:charset表中存储数据的字符集 校对集:colloate表中用来校对数据的校对集 存储引擎  :en

【转载】JDBC操作LOB字段

转自:http://www.cnblogs.com/tengtao93/p/4984689.html 1.LOB(Large Objects)大对象,是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储多达4GB的数据) --LOB分类两种类型:1)内部LOB: 2)外部LOB: --内部LOB将数据以字节流的形式存储在数据库的内部.因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作: --Oracle支持三种类型的内部LOB:1)BLOB(

表操作及字段查询

模型层 单表操作 1. all(): 查询所有结果 2. filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 3.get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误. 4. exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象.类似于取反. 5. values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列mod

1122 django属性操作orm字段数据操作

目录 1. 静态文件的配置 手动静态文件的访问资源 静态文件的动态绑定 2.request方法 2.1 请求方式 2.2 获取前端的请求方式 request.method 2.3 request方法 request.method request.POST request.GET .get方法 3. pycharm连接MySQL 4. django连接MySQL数据库 4.1.配置文件配置 4.2.指定使用的数据库连接模块 5.django orm简介 5.1 基本概念 1. orm对象关系映射

【HAVENT原创】Salesforce 给字段加上链接

1.首先在创建字段时候选择类型 Formula 2.第二步字段类型我选择了 Text 3.编辑公式: HYPERLINK(url, friendly_name [,target]) HYPERLINK("https://kingslanding.gopeople.com.au/#/job?keyword=" & Job_Number_del__c, Job_Number_del__c, "_blank") 4.保存搞定!

[原创]java操作word(一)

一. 需求背景 在做项目的过程中,经常会遇到要把数据库数据导出到Word文件中的需求,因为很多情况下,我们需要将数据导出到WORD中进行打印.此需求可以通过用程序填充数据到word模板中来实现.所谓模板也就是标记了数据位置的Word文件.模板可以简单的分为两种:一种模板包含了固定的.有限个数的数据位置,比如一个请假条的模板中只有"部门.姓名.原因.天数.日期"几个数据位置,也可能是这5个数据位置中的某4个.某3个或某1个,但模板中的标签数量总是这个集合的子集(如下图所示:):另一种是包