プライマリ・コンテンツに移動

Oracle® Data Provider for .NET開発者ガイド ODAC 12.2c リリース1 (12.2.0.1) for Microsoft Windows E88311-03 |
| 目次 | 索引

前 | 次 |

# GetOracleClobForUpdate(int)

このメソッドは、指定された`CLOB`列の更新可能な`OracleClob`オブジェクトを戻します。

宣言

    // C#
    public OracleClob GetOracleClobForUpdate(int index);

パラメータ

- `index`

  ゼロベースの列索引です。

戻り値

更新可能な`OracleClob`。

例外

`InvalidOperationException` - 接続またはリーダーがクローズされているか、`Read()`が呼び出されていないか、すべての行が読み取られています。

`IndexOutOfRangeException` - 列索引が無効です。

`InvalidCastException` - この列型のアクセッサ・メソッドが無効か、列値が`NULL`です。

備考

`OracleCommand`の`ExecuteReader()`メソッドを起動する場合、`OracleDataReader`によってフェッチされる全データは、特定のスナップショットから導出されます。このため、アクセッサ・メソッドを同じ列で呼び出すと、常に同じ値が戻されます。`GetOracleClobForUpdate()`メソッドではデータベース・ラウンドトリップを発生させ、現行の`CLOB`データに対する参照を取得する一方、`FOR` `UPDATE`句を使用して行のロックも行います。つまり、元のスナップショットからは値を取得できないため、`GetOracleClob()`から取得した`OracleClob`には、`GetOracleClobForUpdate()`から取得した`OracleClob`とは異なる値を含めることができます。

このメソッドをコール後に`CLOB`列はロックされるため、戻された`OracleClob`オブジェクトを使用して、`CLOB`を安全に更新できます。

このメソッドを内部で起動すると、`WAIT`句を使用せずに`SELECT..FOR` `UPDATE`文が実行されます。このため、その行に対してロックが取得されるまで、文は無期限に待機できます。

このメソッドを呼び出す前に`IsDBNull`を呼び出して、`NULL`値を確認してください。

例

次の例では、更新のためリーダーから`OracleClob`オブジェクトを取得し、`OracleClob`オブジェクトを更新して、トランザクションをコミットしています。

    /* Database Setup, if you have not done so yet.
    connect scott/tiger@oracle
    CREATE TABLE empInfo (
    empno NUMBER(4) PRIMARY KEY,
    empName VARCHAR2(20) NOT NULL,
    hiredate DATE,
    salary NUMBER(7,2),
    jobDescription Clob,
    byteCodes BLOB
    );

    Insert into empInfo(EMPNO,EMPNAME,JOBDESCRIPTION,byteCodes) values
    (1,'KING','SOFTWARE ENGR', '5657');
    Insert into empInfo(EMPNO,EMPNAME,JOBDESCRIPTION,byteCodes) values
    (2,'SCOTT','MANAGER', '5960');
    commit;

    */
    // C#

    using System;
    using System.Data;
    using Oracle.DataAccess.Client;
    using Oracle.DataAccess.Types;

    class GetOracleClobForUpdateSample
    {
      static void Main()
      {
        string constr = "User Id=scott;Password=tiger;Data Source=oracle";
        OracleConnection con = new OracleConnection(constr);
        con.Open();

        // Get the job description for empno = 1
        string cmdStr = "SELECT JOBDESCRIPTION, EMPNO FROM EMPINFO where EMPNO = 1";
        OracleCommand cmd = new OracleCommand(cmdStr, con);

        // Since we are going to update the OracleClob object, we will
        //  have to create a transaction
        OracleTransaction txn = con.BeginTransaction();

        // Get the reader
        OracleDataReader reader = cmd.ExecuteReader();

        // Declare the variables to retrieve the data in EmpInfo
        OracleClob jobDescClob;

        // Read the first row
        reader.Read();

        if (!reader.IsDBNull(0))
        {
          jobDescClob = reader.GetOracleClobForUpdate(0);

          // Close the reader
          reader.Close();

          // Update the job description Clob object
          char[] jobDesc = "-SALES".ToCharArray();
          jobDescClob.Append(jobDesc, 0, jobDesc.Length);

          // Now commit the transaction
          txn.Commit();
          Console.WriteLine("Clob Column successfully updated");
        }
        else
          reader.Close();

        // Close the connection
        con.Close();
      }
    }

関連項目:

- Oracle.DataAccess.ClientおよびOracle.ManagedDataAccess.Clientのネームスペース

- OracleDataReaderクラス

- OracleDataReaderメンバー

- LOBサポート