当前位置:主页   - 电脑 - 程序设计 - C/C++
ODAC应用技巧(二)使用BLOB及CLOB数据类型
来源:网络   作者:   更新时间:2012-08-21
收藏此页】    【字号    】    【打印】    【关闭

  ODAC 组件支持 Oracle 8 的 BLOB 和 CLOB 数据类型。你可以使用 TOraQuery 组件来获取 LOB 字段的值,使用同样的方法,你也可以获取  LONG 或 LONG ROW 字段。 当你需要使用 SQL DML 及 PL/SQL 语句存取这些字段时,你就会发现 LOB 数据类型的用法有明显的不同。

  BLOB 和 CLOB 数据类型通过 LOB 定位器(指定数据地址) 存储在表列中;实际的 BLOB 和 CLOB 数据存储在独立的表空间中。与之不同的是,LONG 或 LONG RAW 类型存储在数据库中,表中存放着它们的实际值。

  当存取 LOB 列时,返回的是定位器,而不像 LONG 或 LONG RAW 数据类型那样返回它的实际值。

  例如,分析这个表的定义:

CREATE TABLE ClobTable (
Id NUMBER,
Name VARCHAR2(30),
Value CLOB
)

  如果我们不通过值参数初始化 LOB 定位器, Oracle 将不允许使用下面的语句来更新数据表:

UPDATE ClobTable
SET
Name = :Name,
Value = :Value

WHERE
Id = :Id

  要初始化 LOB 定位器,你必须使用 EMPTY_BLOB 或 EMPTY_CLOB Oracle 函数。要返回初始化后的定位器,应在同样的语句中使用 RETURNING 子句。例如:

UPDATE ClobTable
SET
Name = :Name,
Value = EMPTY_CLOB()
WHERE
Id = :Id
RETURNING
Value
INTO
:Value

  ODAC 写 LOB 数据到 Oracle 且返回初始值字段,需使用:值参数。

  存储过程允许自动初始化 LOB 值,方法如下:

CREATE OR REPLACE
PROCEDURE ClobTableUpdate (p_Id NUMBER, p_Name VARCHAR2,
p_Value OUT CLOB)
is
begin
UPDATE ClobTable
SET 
Name = p_Name,
Value = EMPTY_CLOB()
WHERE
Id = p_Id
RETURNING
Value
INTO
p_Value;
end;

  注意:值参数被声明为 OUT。同时,设置 LOB 数据类型的参数的 ParamType 属性为 ptInput ,且指定它到所需的数据前来实际调用存储过程。我们可以这样调用前面声明的存储过程:

OraStroredProc1.StoredProcName := 'ClobTableUpdate';
OraStroredProc1.Prepare;
OraStroredProc1.ParamByName('p_Id').AsInteger := Id;
OraStroredProc1.ParamByName('p_Name').AsString := Name;
OraStroredProc1.ParamByName('Value').ParamType := ptInput;
OraStroredProc1.ParamByName('Value').AsCLOBLocator.
LoadFromFile(FileName);
OraStroredProc1.Execute;

  对 ODAC 来说,在 LOB 操作中使用 ParamType 属性是非常重要的。如果 ParamType 是 ptInput , ODAC 写数据到服务器,如果 ParamType 是 ptOutput,它则读取数据。

  你可以使用 LOB 参数的 dtBlob 和 dtMemo 数据类型来编写普通的 DML 语句。在这种情况下, Oracle 自动将 LONG 和 LONG ROW 类型的值转换为 CLOB 或 BLOB 数据。

  系列文章:

  ODAC 使用技巧(四)使用VARRAY数据类型

  ODAC应用技巧(三)主/明细表

  ODAC应用技巧(一)使用ODAC的Net方式

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明