clob

合集下载

oracle select clob字段内容-概述说明以及解释

oracle select clob字段内容-概述说明以及解释

oracle select clob字段内容-概述说明以及解释1.引言1.1 概述CLOB字段(Character Large Object)是一种用于存储大文本数据的Oracle数据库字段类型。

在数据库中,通常将CLOB字段用于存储大于4000个字符的文本数据,例如长篇文章、日志信息、XML文档等。

本文将重点讨论如何在Oracle数据库中查询CLOB字段的内容。

通过有效地查询CLOB字段,我们可以轻松地获取和操作大文本数据,从而更好地满足业务需求。

接下来,我们将详细介绍Oracle中如何查询CLOB字段内容,以及在查询过程中需要注意的事项。

通过学习本文内容,读者将更加了解如何有效地处理CLOB字段数据,提高数据库查询和管理的效率。

1.2文章结构文章结构部分主要介绍了本文的整体结构和内容安排。

首先,我们将引言部分介绍本文的背景和目的,引导读者了解本文的主题和意义。

接着,在正文部分我们将详细介绍什么是CLOB字段以及在Oracle中如何查询CLOB字段内容,同时提供查询过程中需要注意的事项。

最后,在结论部分我们将对本文进行总结,探讨CLOB字段的应用场景,以及展望未来可能的发展方向。

通过本文的结构安排,读者将能够全面了解和掌握如何查询Oracle中的CLOB字段内容。

1.3 目的:本文的目的在于帮助读者了解如何在Oracle数据库中查询CLOB字段的内容。

CLOB字段是一种专门用来存储大文本数据的字段类型,通常用于存储文档、日志、报告等内容较大的数据。

在实际应用中,我们经常需要查询CLOB字段的内容以便分析和处理,因此正确地查询和处理CLOB字段内容具有重要意义。

通过本文的阐述,读者将能够清楚地了解什么是CLOB字段、如何准确地查询CLOB字段内容以及在查询过程中需要注意的事项。

希望读者在阅读完本文后能够掌握查询CLOB字段内容的技巧,提高数据处理的效率和准确性。

2.正文2.1 什么是CLOB字段CLOB是Oracle数据库中一种用来存储大容量字符数据的数据类型,其全称为Character Large Object。

CLOB、BLOB , CLOB与BLOB的区别

CLOB、BLOB , CLOB与BLOB的区别

CLOB、BLOB , CLOB与BLOB的区别CLOB 定义数据库中的一种保存文件所使用的类型。

Character Large ObjectSQL 类型 CLOB 在 JavaTM 编程语言中的映射关系。

SQL CLOB 是内置类型,它将字符大对象 (Character Large Object) 存储为数据库表某一行中的一个列值。

默认情况下,驱动程序使用 SQL locator(CLOB) 实现Clob 对象,这意味着 CLOB 对象包含一个指向 SQL CLOB 数据的逻辑指针而不是数据本身。

Clob 对象在它被创建的事务处理期间有效。

在一些数据库系统里,也使用Text 作为CLOB的别名,比如SQL Server BLOB的含义BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。

在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。

BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。

根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。

但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。

在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。

CLOB和BLOB的区别CLOB使用CHAR来保存数据。

如:保存XML文档。

BLOB就是使用二进制保存数据。

如:保存位图。

Mysql中的blob类系列MySQL中,BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。

MySQL的四种BLOB类型类型大小(单位:字节)TinyBlob 最大 255Blob 最大 65KMediumBlob 最大 16MLongBlob 最大 4GJAVA里面对CLOB的操作在绝大多数情况下,使用2种方法使用CLOB1 相对比较小的,可以用String进行直接操作,把CLOB看成字符串类型即可2 如果比较大,可以用 getAsciiStream 或者 getUnicodeStream 以及对应的 setAsciiStream 和 setUnicodeStream 即可读取数据ResultSet rs = stmt.executeQuery("SELECT TOP 1 * FROM Test1");rs.next();Reader reader = rs.getCharacterStream(2);插入数据PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (c1_id, c2_vcmax) VALUES (?, ?)");pstmt.setInt(1, 1);pstmt.setString(2, htmlStr);pstmt.executeUpdate();更新数据Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM test1");rs.next();Clob clob = rs.getClob(2);long pos = clob.position("dog", 1);clob.setString(1, "cat", len, 3);rs.updateClob(2, clob);rs.updateRow();。

single_clob 解析-概述说明以及解释

single_clob 解析-概述说明以及解释

single_clob 解析-概述说明以及解释1.引言1.1 概述在数据库领域中,CLOB(Character Large Object)是指存储大字符数据的数据类型。

在实际应用中,有时候我们只需要存储单个CLOB对象,即单个CLOB。

本文将就单个CLOB的定义、特点、应用场景以及优缺点进行深入解析,并探讨其在数据库管理系统中的重要性和未来发展前景。

通过本文的阐述,读者将能够更好地理解单个CLOB 的概念和作用,为其在实际工作中的应用提供参考和指导。

1.2 文章结构本文将分为三个部分进行阐述。

第一部分是引言,其中将对single_clob进行概述,介绍文章的结构和目的。

第二部分是正文部分,将重点讨论单个CLOB的定义、特点、应用场景以及优缺点。

最后一部分是结论部分,将总结单个CLOB的重要性,展望其未来发展,并得出结论。

通过这样的结构安排,读者可以系统地了解和掌握有关single_clob的知识,从而深入了解其在实际应用中的价值和意义。

1.3 目的本文的主要目的是对单个CLOB进行深入解析,探讨其定义、特点、应用场景以及优缺点。

通过对单个CLOB的详细讨论,旨在帮助读者更好地理解和应用这一数据类型,提高其在实际工作中的效率和准确性。

同时,通过对单个CLOB的重要性进行总结和展望未来的发展趋势,使读者能够更好地把握技术趋势,做出更明智的决策。

最终,通过结论部分的总结,让读者对单个CLOB有一个全面而深入的理解,为其后续的工作和学习提供指导和参考。

2.正文2.1 单个CLOB的定义和特点CLOB是一种用于存储大量字符数据的数据类型,它可以存储最大4GB的字符数据。

在数据库中,CLOB通常被用来存储文本型数据,例如文章内容、日志记录、网页代码等。

单个CLOB指的是只包含一个CLOB数据的字段或列,与其他数据类型的字段不同,单个CLOB可以存储非常大的字符数据,使它非常适合存储长文本信息。

单个CLOB的特点包括:1. 存储大量字符数据:单个CLOB可以存储最大4GB的字符数据,可以满足大部分文本型数据的存储需求。

clob和blob的区别

clob和blob的区别

clob 和blob的‎区别一.定义LONG: 可变长的字符‎串数据,最长2G,LONG具有‎V ARCHA‎R2列的特性‎,可以存储长文‎本一个表中最‎多一个LON‎G列LONG RAW: 可变长二进制‎数据,最长2GCLOB: 字符大对象C‎l ob 用来存储单字‎节的字符数据‎NCLOB: 用来存储多字‎节的字符数据‎BLOB: 用于存储二进‎制数据BFILE: 存储在文件中‎的二进制数据‎,这个文件中的‎数据只能被只‎读访。

但该文件不包‎含在数据库内‎。

bfile字‎段实际的文件‎存储在文件系‎统中,字段中存储的‎是文件定位指‎针.bfile对‎o racle‎来说是只读的‎,也不参与事务‎性控制和数据‎恢复.CLOB,NCLOB,BLOB都是‎内部的LOB‎(Large Object‎)类型,最长4G,没有LONG‎只能有一列的‎限制要保存图片、文本文件、Word文件‎各自最好用哪‎种数据类型?--BLOB最好‎,LONG RAW也不错‎,但Long是‎o racle‎将要废弃的类‎型,因此建议用B‎L OB。

二、操作1、getCLOBjava 代码//获得数据库连‎接Connec‎t ion con = Connec‎t ionFa‎c tory.getCon‎n ectio‎n();con.setAut‎o Commi‎t(false);Statem‎e nt st = con.create‎S tatem‎e nt();//不需要“for‎update‎”Result‎S et rs = st.execut‎e Query‎("selec t‎CLOBAT‎T R from TESTCL‎O B where ID=1");if (rs.next()){java.sql.Clob clob = rs.getClo‎b("CLOBAT‎T R");Reader‎inStre‎a m = clob.getCha‎r acter‎S tream‎();char[] c = new char[(int) clob.length‎()];inStre‎a m.read(c);//data是读‎出并需要返回‎的数据,类型是Str‎i ngdata = new String‎(c);inStre‎a m.close();}inStre‎a m.close();mit‎();con.close();BLOBjava 代码//获得数据库连‎接Connec‎t ion con = Connec‎t ionFa‎c tory.getCon‎n ectio‎n();con.setAut‎o Commi‎t(false);Statem‎e nt st = con.create‎S tatem‎e nt();//不需要“for‎update‎”Result‎S et rs = st.execut‎e Query‎("select‎BLOBAT‎T R from TESTBL‎O B where ID=1");if (rs.next()){java.sql.Blob blob = rs.getBlo‎b("BLOBAT‎T R");InputS‎t ream inStre‎a m = blob.getBin‎a ryStr‎e am();//data是读‎出并需要返回‎的数据,类型是byt‎e[]data = new byte[input.availa‎b le()];inStre‎a m.read(data);inStre‎a m.close();}inStre‎a m.close();mit‎();con.close();2、putCLOBjava 代码//获得数据库连‎接Connec‎t ion con = Connec‎t ionFa‎c tory.getCon‎n ectio‎n();con.setAut‎o Commi‎t(false);Statem‎e nt st = con.create‎S tatem‎e nt();//插入一个空对‎象empty‎_clob()st.execut‎e Updat‎e("insert‎into TESTCL‎O B (ID, NAME, CLOBAT‎T R) values‎(1, "thenam‎e", empty_‎c lob())");//锁定数据行进‎行更新,注意“for‎update‎”语句Result‎S et rs = st.execut‎e Query‎("select‎CLOBAT‎T R from TESTCL‎O B where ID=1 for update‎");if (rs.next()){//得到java‎.sql.Clob对象‎后强制转换为‎o racle‎.sql.CLOBoracle‎.sql.CLOB clob = (oracle‎.sql.CLOB) rs.getClo‎b("CLOBAT‎T R");Writer‎outStr‎e am = clob.getCha‎r acter‎O utput‎S tream‎();//data是传‎入的字符串,定义:String‎datachar[] c = data.toChar‎A rray();outStr‎e am.write(c, 0, c.length‎);}outStr‎e am.flush();outStr‎e am.close();mit‎();con.close();BLOBjava 代码//获得数据库连‎接Connec‎t ion con = Connec‎t ionFa‎c tory.getCon‎n ectio‎n();con.setAut‎o Commi‎t(false);Statem‎e nt st = con.create‎S tatem‎e nt();//插入一个空对‎象empty‎_blob()st.execut‎e Updat‎e("insert‎into TESTBL‎O B (ID, NAME, BLOBAT‎T R) values‎(1, "thenam‎e", empty_‎b lob())");//锁定数据行进‎行更新,注意“for‎update‎”语句Result‎S et rs = st.execut‎e Query‎("select‎BLOBAT‎T R from TESTBL‎O B where ID=1 for update‎");if (rs.next()){//得到java‎.sql.Blob对象‎后强制转换为‎o racle‎.sql.BLOBoracle‎.sql.BLOB blob = (oracle‎.sql.BLOB) rs.getBlo‎b("BLOBAT‎T R");Output‎S tream‎outStr‎e am = blob.getBin‎a ryOut‎p utStr‎e am();//data是传‎入的byte‎数组,定义:byte[] dataoutStr‎e am.write(data, 0, data.length‎);}outStr‎e am.flush();outStr‎e am.close();mit‎();con.close();。

oracle的字符串类型

oracle的字符串类型

oracle的字符串类型Oracle的字符串类型有VARCHAR2、CHAR、CLOB和NCLOB等。

这些字符串类型在Oracle数据库中起着非常重要的作用,可以用于存储和处理各种类型的文本数据。

我们来介绍一下VARCHAR2类型。

VARCHAR2是一种可变长度的字符串类型,可以存储最多4000个字符。

它适用于存储变长的文本数据,比如用户的姓名、地址、描述等信息。

与之相对的是CHAR类型,它是一种定长的字符串类型,需要指定字符串的长度。

CHAR类型适用于存储长度固定的文本数据,比如国家代码、邮政编码等。

接下来,我们来介绍一下CLOB类型。

CLOB是一种用于存储大量文本数据的字符串类型,可以存储最多4GB的数据。

CLOB适用于存储较长的文本数据,比如文章内容、日志记录等。

与之类似的是NCLOB类型,它是用于存储Unicode字符集的大文本数据。

在Oracle中,我们可以使用字符串函数来处理字符串类型的数据。

比如,我们可以使用LENGTH函数来获取字符串的长度,使用SUBSTR函数来截取字符串的一部分,使用CONCAT函数来拼接多个字符串等。

这些字符串函数可以帮助我们对字符串数据进行各种操作和处理。

除了基本的字符串操作,Oracle还提供了一些高级的字符串处理功能。

比如,我们可以使用REGEXP_REPLACE函数来进行正则表达式替换,使用REGEXP_SUBSTR函数来进行正则表达式匹配等。

这些高级的字符串处理功能可以帮助我们更加灵活地处理字符串数据。

在实际应用中,我们经常需要对字符串进行排序和比较。

在Oracle 中,字符串的排序和比较是按照字符的ASCII码进行的。

如果我们需要按照特定的排序规则进行排序,可以使用NLS_SORT参数来指定排序规则。

另外,我们还可以使用NLS_COMP参数来指定字符串的比较规则,比如是否区分大小写、是否区分重音符号等。

除了基本的字符串操作和函数,Oracle还提供了一些用于处理字符串数据的内置包和类型。

BLOB和CLOB的存取操作

BLOB和CLOB的存取操作

BLOB和CLOB的存取操作BLOB和CLOB是数据库中用于存储大型二进制对象和字符对象的数据类型。

BLOB代表二进制大对象,CLOB代表字符大对象。

在数据库中,BLOB和CLOB可以存储图像、音频、视频文件等二进制数据,以及大段的文本数据。

存取操作BLOB和CLOB数据可以通过数据库中的SQL语句和程序代码来实现。

下面将详细介绍如何进行存取操作,包括数据的插入、查询、更新和删除。

1.插入操作:a.存储二进制数据(BLOB):-使用INSERTINTO语句插入一条记录,使用BINARY或VARBINARY关键字指定数据类型。

- 使用参数化查询(Prepared Statement)将BLOB数据作为输入。

b.存储字符数据(CLOB):-使用INSERTINTO语句插入一条记录,使用VARCHAR或TEXT关键字指定数据类型。

-使用参数化查询将CLOB数据作为输入。

2.查询操作:a.查询二进制数据(BLOB):-使用SELECT语句查询数据表,并使用BINARY或VARBINARY数据类型读取BLOB数据。

- 通过流(InputStream)读取BLOB数据并进行处理。

b.查询字符数据(CLOB):-使用SELECT语句查询数据表,并使用VARCHAR或TEXT数据类型读取CLOB数据。

- 通过字符串(String)读取CLOB数据并进行处理。

3.更新操作:a.更新二进制数据(BLOB):-使用UPDATE语句更新表中的记录,并使用BINARY或VARBINARY数据类型更新BLOB字段。

-使用参数化查询将新的BLOB数据作为输入。

b.更新字符数据(CLOB):-使用UPDATE语句更新表中的记录,并使用VARCHAR或TEXT数据类型更新CLOB字段。

-使用参数化查询将新的CLOB数据作为输入。

4.删除操作:a.删除二进制数据(BLOB):-使用DELETE语句从数据表中删除记录,或设置BLOB字段的值为NULL。

oracle clob字段insert语句 -回复

oracle clob字段insert语句 -回复

oracle clob字段insert语句-回复什么是CLOB字段?CLOB是Oracle数据库中的一种数据类型,代表Character Large Object,用于存储大量的字符数据。

CLOB字段可以存储最大4GB的数据,在数据库中以VARCHAR2的形式存储。

CLOB字段通常被用来存储文本或文档信息,如文章、日志、报告、HTML代码等。

如何创建含有CLOB字段的表?要创建一个含有CLOB字段的表,可以使用CREATE TABLE语句。

下面是一个示例:CREATE TABLE my_table(id NUMBER(10),content CLOB);在上面的示例中,my_table是表名,id是一个整数字段,content是CLOB 字段。

如何向CLOB字段插入数据?要向CLOB字段插入数据,需要使用INSERT INTO语句。

下面是一个示例:INSERT INTO my_table(id, content)VALUES(1, '这是一个CLOB字段的内容');在上面的示例中,我们向my_table表的id字段插入了整数值1,向content字段插入了字符串'这是一个CLOB字段的内容'。

请注意,单引号必须包裹字符串,因为CLOB类型的值是文本类型。

如果要插入较长的文本数据,可以使用绑定变量和LOB函数。

下面是一个示例:DECLAREl_content CLOB;BEGINl_content := '这是一个很长的文本数据...';INSERT INTO my_table(id, content)VALUES(2, l_content);COMMIT;END;在上面的示例中,我们使用了一个变量l_content来存储较长的文本数据。

然后,我们将l_content绑定到INSERT INTO语句中的content字段。

最后,使用COMMIT语句提交事务。

clob类型

clob类型

clob类型在Oracle Database中,VARCHAR2 字段类型,最⼤值为4000;PL/SQL中 VARCHAR2 变量类型,最⼤字节长度为32767。

在Oracle中,LOB(Large Object,⼤型对象)类型的字段现在⽤得越来越多了。

因为这种类型的字段,容量⼤(最多能容纳4GB的数据),且⼀个表中可以有多个这种类型的字段,很灵活,适⽤于数据量⾮常⼤的业务领域(如图象、档案等)。

LOB类型分为BLOB和CLOB两种:BLOB即⼆进制⼤型对象(Binary Large Object),适⽤于存贮⾮⽂本的字节流数据(如程序、图象、影⾳等)。

⽽CLOB,即字符型⼤型对象(Character Large Object),则与字符集相关,适于存贮⽂本型的数据(如历史档案、⼤部头著作等)。

Oracle中的LOB数据类型分类CLOB:存储⼤量单字节字符数据。

NLOB:存储定宽多字节字符数据。

BLOB:存储较⼤⽆结构的⼆进制数据。

BFILE:将⼆进制⽂件存储在数据库外部的操作系统⽂件中。

存放⽂件路径。

⼤对象列时,插⼊空⽩构造函数。

字符型:empty_clob(),empty_nclob()⼆进制型:empty_blob()读取⼤对象数据的过程和函数建表语句:create table TEMP(name VARCHAR2(200),age NUMBER,temp_clob CLOB)DBMS_LOB包:包含处理⼤对象的过程和函数1. DBMS_LOB.Read():从LOB数据中读取指定长度数据到缓冲区的过程。

语法: DBMS_LOB.Read(LOB数据,指定长度,起始位置,存储返回LOB类型值变量);DECLAREl_clob CLOB;vrstr VARCHAR2(1000);lenght NUMBER(4);stat NUMBER(4);BEGINSELECT t.temp_clobINTO l_clobFROM temp tWHERE ROWNUM =1;lenght := dbms_lob.getlength(l_clob);stat :=1;dbms_lob.read(l_clob, lenght, stat, vrstr);dbms_output.put_line('返回值为: '|| vrstr);END;运⾏结果: 返回值为: 加⼊博客园的第⼀天2. DBMS_LOB.SubStr():从LOB数据中提取⼦字符串的函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

mfc 插入oracle blob、clob字段分类:MFC ORACLE2013-08-31 15:17 226人阅读评论(0) 收藏举报cc++VC++mfcoracle参考网址:/p/orclib/discussion/470800/thread/5a2f05f1当我看到这篇文字的时候想死的心都有了,所以写下来作为以后的教训,而且是深刻的教训呀。

方法一:OCI_Statement* stmt = OCI_StatementCreate(conn);OCI_Lob * clob = OCI_LobCreate(conn, OCI_CLOB);OCI_Prepare(stmt, "UPDATE tbl_clob SET clob = :clob WHERE id = :id");OCI_BindLob(stmt, ":clob", clob);OCI_BindInt(stmt, ":id", &id);OCI_LobWrite(clob, const_cast(data.c_str()), data.length());OCI_Execute(stmt);方法二:#include "ocilib.h"#define SIZE_BUF 512int main(void){OCI_Connection *cn;OCI_Statement *st;OCI_Resultset *rs;OCI_Lob *lob1, *lob2;char temp[SIZE_BUF+1];int code, n;if (!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT))return EXIT_FAILURE;cn = OCI_ConnectionCreate("db", "usr", "pwd", OCI_SESSION_DEFAULT); st = OCI_StatementCreate(cn);OCI_ExecuteStmt(st, "select code, content from test_lob for update");rs = OCI_GetResultset(st);while (OCI_FetchNext(rs)){code = OCI_GetInt(rs, 1);lob1 = OCI_GetLob(rs, 2);lob2 = OCI_LobCreate(cn, OCI_CLOB);n = OCI_LobWrite(lob1, "Today, ", 7);OCI_LobSeek(lob1, n, OCI_SEEK_SET);n = OCI_LobWrite(lob2, "I'm going to the cinema !", 25);OCI_LobAppendLob(lob1, lob2);OCI_LobSeek(lob1, 0, OCI_SEEK_SET);n = OCI_LobRead(lob1, temp, SIZE_BUF);temp[n] = 0;printf("code: %i, action : %s\n", code, temp);OCI_LobFree(lob2);}printf("\n%d row(s) fetched\n", OCI_GetRowCount(rs));OCI_Cleanup();return EXIT_SUCCESS;}Hi,I am currently switching an application from using Pro*c to using OCILIB.Everything works fine, except updating clobs.When trying to update a clob, I always get an access violation inoracommon9.dll trying to read address 0x45.An example:... // Initializing connectionOCI_Statement* stmt = OCI_StatementCreate(conn);OCI_Prepare(stmt, "UPDATE tbl_clob SET clob = :clob WHERE id = :id"); OCI_SetBindAllocation(stmt, OCI_BAM_INTERNAL);OCI_BindArrayOfLobs(stmt, ":clob", NULL, OCI_CLOB, 0);string data; // Contains approx. 4 million charssize_t charCount = data.length();size_t byteCount =0;OCI_LobWrite2(static_cast<OCI_Lob*>(OCI_BindGetData(OCI_GetBind2( stmt, ":clob"))), const_cast<char*>(data.c_str()), &charCount,&byteCount);... // Bind :idOCI_Execute(stmt); // Access Violation during this callI am using OCILIB 3.9.2 on Oracle 9.2.0.8.What am I doing wrong?Regards,DriesReplyLinkAttachoAnonymous2011-09-26Hi,I searched the internet and found someone having a similar problem using plain OCI: https:///forums/thread.jspa?threadID=194246 and I read Either a single locator or an array of locators can be bound in a singlebind call. In each case, the application must pass the address of a LOBlocator and not the locator itselfin the OCI documentation /docs/cd/B13789_01/appdev. 101/b10779/oci05bnd.htm#432118.So, after some debugging I changed:case OCI_CDT_LOB:{OCI_Lob *lob = OCI_LobCreate(bnd->stmt->con,bnd->subtype);if (lob !=NULL){bnd->input = (void**) lob;bnd->buf.data = (void**) lob->handle;}break;}intocase OCI_CDT_LOB:{OCI_Lob *lob = OCI_LobCreate(bnd->stmt->con,bnd->subtype);if (lob !=NULL){bnd->input = (void**) lob;bnd->buf.data = (void**) [b]&[/b]lob->handle; }break;}This fixes the access violation and the data send to database looks ok.Might this be a bug?Regards,DriesReplyLinkAttacho∙Vincent Rogier2011-09-26Did you set OCI_bindArraySetSize() ??ReplyLinkAttacho∙Anonymous2011-09-26No, I didn't.If I do, it is working fine. But now another branch is executed inOCI_BindAllocData and the code, that I changed before, is not executed.OCI_BindArraySetSize(stmt, 1);...OCI_LobWrite2(static_cast<OCI_Lob**>(OCI_BindGetData(OCI_GetBind2 (stmt, ":clob")))[0], const_cast<char*>(data.c_str()), &charCount, &byteCount);ReplyLinkAttacho∙Vincent Rogier2011-09-26are you binding an array of lob or just a single lob ?If you're passing an array, you must use the array interface correctly and useOCI_BindArraySetSize()ReplyLinkAttacho∙Anonymous2011-09-26I am just binding a single lob.I (mis)used OCI_BindArrayOfLobs as I could not get OCI_BindLob to do an internal allocation.When I do use OCI_BindLob with a given lob, does the statement clean up the lob or should I call OCI_LobFree?ReplyLinkAttacho∙Vincent Rogier2011-09-26... // Initializing connectionstring data;int id;... // Initializing DATA AND IDOCI_Statement* stmt = OCI_StatementCreate(conn);OCI_Lob * clob = OCI_LobCreate(conn, OCI_CLOB);OCI_Prepare(stmt, "UPDATE tbl_clob SET clob = :clob WHERE id = :id"); OCI_BindLob(stmt, ":clob", clob);OCI_BindInt(stmt, ":id", &id);OCI_LobWrite(clob, const_cast<char*>(data.c_str()), data.length());OCI_Execute(stmt);ReplyLinkAttacho∙Anonymous2011-09-26The database layer am I migrating over from Pro*C is lot more dynamic than thesimple example I gave to demonstrate the problem. Adding the factOCI_BAM_INTERNAL and OCI_BindLob can not work together (gives an ORA-24813; it looks like the OCILobLocator is never assigned to buf.data of the OCI_Bind), Iwill use the array interface as you proposed.Thanks for your help.As I want use OCI_BAM_INTERNAL fAs I am using OCI_BAM_INTERNAL for the wholeReplyLinkAttacho∙Vincent Rogier2011-09-26OCI_BAM_INTERNAL and OCI_BindLob() should work together.Do you still have an error if you replace, in the original code you've postedthe call to OCI_BindArrayOfLobs() by OCI_BindLob() ?ReplyLinkAttacho∙Anonymous2011-09-26Replacing it by OCI_BindLob crashes because when called with data == NULL, the type to use, expected in data->type, is not valid.ReplyLinkAttacho∙Vincent Rogier2011-09-26in fact, OCI_SetBindAllocation() only work for array interface because for object like lobs, there is no way internally to find out the type of lob to create (clob or lob)....。

相关文档
最新文档