OracleLob Class

Represents a large object binary (LOB) data type stored on an Oracle server. This class cannot be inherited.

Namespace: System.Data.OracleClient
Assembly: System.Data.OracleClient (in

public ref class OracleLob sealed : public Stream, ICloneable, IDisposable, INullable
public final class OracleLob extends Stream implements ICloneable, IDisposable, 
public final class OracleLob extends Stream implements ICloneable, IDisposable, 
Not applicable.

An OracleLob differs from an OracleBFile in that the data is stored on the server instead of in a physical file in the operating system. It can also be a read-write object, unlike an OracleBFile, which is always read-only.

An OracleLob may be one of these OracleType data types.

OracleType data type



An Oracle BLOB data type that contains binary data with a maximum size of 4 gigabytes (GB). This maps to an Array of type Byte.


An Oracle CLOB data type that contains character data, based on the default character set on the server, with a maximum size of 4 GB. This maps to String.


An Oracle NCLOB data type that contains character data, based on the national character set on the server with a maximum size of 4 GB. This maps to String.

The .NET application developer can retrieve the Oracle LOB values into basic .NET data types, such as Array of type Byte and String, or the specialized OracleLob data type. The OracleLob class supports reading and writing data from and to the Oracle LOB in the Oracle database.

The main characteristics of an OracleLob data type that distinguishes it from basic .NET data types are that:

  • After you retrieve the Oracle LOB value from the Oracle database into OracleLob class, you can change the LOB data in an open transaction and your changes are directly reflected to the database. If you retrieve the Oracle LOB value into an Array of type Byte or String and update these arrays, your changes are not reflected to the database.

  • When you use the OracleLob class to access a chunk of a LOB value, only that chunk is passed from the Oracle database to the client. When you use the GetChars method to access a chunk of a LOB value, the entire contents of the value are passed from the Oracle database to the client.

To obtain an OracleLob object, call the GetOracleLob method.

You can construct an OracleLob that is NULL using this format:

OracleLob myLob = OracleLob.Null;

This technique is used primarily to test whether a LOB returned from the server is NULL, as this example illustrates:

If(myLob == OracleLob.Null)

A NULL LOB behaves similarly to a zero-byte LOB in that Read succeeds and always returns zero bytes.

Selecting a LOB column that contains a null value returns Null.

You must begin a transaction before obtaining a temporary LOB. Otherwise, the OracleDataReader may fail to obtain data later.

You can also open a temporary LOB in Oracle by calling the DBMS_LOB.CREATETEMPORARY system stored procedure and binding a LOB output parameter. On the client side, a temporary LOB behaves like a table-based LOB. For example, to update the temporary LOB, it must be enclosed in a transaction.

The following C# example demonstrates how to open a temporary LOB.

OracleConnection connection = new OracleConnection("server=MyServer; integrated security=yes;");
OracleTransaction transaction = connection.BeginTransaction();
OracleCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText = "declare xx blob; begin dbms_lob.createtemporary(xx, false, 0); :tempblob := xx; end;";
command.Parameters.Add(new OracleParameter("tempblob", OracleType.Blob)).Direction = ParameterDirection.Output;
OracleLob tempLob = (OracleLob)command.Parameters[0].Value;
byte[] tempbuff = new byte[10000];
command.CommandText = "MyTable.MyProc";
command.CommandType = CommandType.StoredProcedure;  
command.Parameters.Add(new OracleParameter("ImportDoc", OracleType.Blob)).Value = tempLob;

The inherited WriteByte method fails if used with character data, and an InvalidOperationException is thrown. Use the Write method instead.

Temporary LOBs are only closed when the connection is closed, but with pooling and under load, temporary LOBs do not close. This can be resolved by disposing the temporary LOB, by invoking tempLob.Dispose().


Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Windows 98, Windows Server 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The Microsoft .NET Framework 3.0 is supported on Windows Vista, Microsoft Windows XP SP2, and Windows Server 2003 SP1.

.NET Framework

Supported in: 3.0, 2.0, 1.1