ADO を使用して Oracle ストアド プロシージャからレコードセットを取得する方法

Microsoft Visual Basic .NET については、次の資料を参照してください。
321718
Microsoft Visual Basic .NET については、次の資料を参照してください。
308072
Microsoft Visual Basic .NET については、次の資料を参照してください。
308073

概要

この資料では、Oracle ストアド プロシージャから標準的なレコードセットを返す Visual Basic 5.0 の ActiveX Data Objects (ADO) プロジェクトまたは Visual Basic 6.0 の ADO プロジェクトを作成する方法を示します。この資料は、「サポート技術情報」 (Microsoft Knowledge Base) の次の資料で説明されている概念に基づいています。
174679 Oracle ストアド プロシージャからレコードセットを取得する方法
この資料の内容は、リモート データ オブジェクト (RDO) を使用して同様のことを行う方法について説明している「サポート技術情報」 (Microsoft Knowledge Base) の次の資料とほぼ同じです。
174981 Oracle ストアド プロシージャから標準的なレコードセットを取得する方法
: マイクロソフトでは、Microsoft ODBC Driver for Oracle の使用をお勧めします。

詳細

サポート技術情報の次の資料には、RDO を使用してストアド プロシージャからレコードセットを返す場合に利用できるすべての方法の詳細なサンプルが示されています。この資料は、それを簡略化したものです。
174679 Oracle ストアド プロシージャからレコードセットを取得する方法
: Oracle ストアド プロシージャを使用して Microsoft ODBC Driver for Oracle によって作成されるレコードセットは、Read Only であり、Static です。レコードセットを取得するには、Oracle Package を作成する必要があります。


この資料のサンプル プロジェクトを Visual Basic 5.0 または Visual Basic 6.0 で作成し、ADO を使用して、Microsoft ODBC Driver for Oracle によって作成されたレコードセットへのアクセスと操作を行うことができます。サポート技術情報の次の資料で説明されている、ストアド プロシージャからレコードセットを取得する機能を使用するには、Microsoft ODBC Driver for Oracle が必要です。
174679 Oracle ストアド プロシージャからレコードセットを取得する方法
Microsoft ODBC Driver for Oracle は、ストアド プロシージャからレコードセットを返すことができる、現在市場に出ている唯一のドライバです。Visual Basic と Oracle との組み合わせの関連情報については、サポート技術情報の次の資料を参照してください。次の資料のサンプルでは、RDO 2.0 が使用されています。
167225 [VB5] RDO:Oracle データベースにアクセスする方法
: この資料のサンプルを実行するには、MDAC 2.1 以降のスタックを入手してインストールする必要があります。Oracle コンポーネントと MDAC コンポーネントの入手方法は、サポート技術情報の次の資料で説明されています。
175018 Microsoft Oracle ODBC Driver を入手してインストールする方法
MDAC 1.5 には、ADO 1.5 と Microsoft ODBC Driver for Oracle 2.0 が含まれています。


ドライバのビルド 2.573 が含まれている MDAC 2.x のスタックは、次の Web アドレスからダウンロードできます。この資料は、2 つの部分に分かれています。前半でプロジェクトの作成手順を示し、後半でプロジェクトの重要な部分について詳しく説明します。

サンプル プロジェクトの作成と実行

  1. Oracle サーバーで次の DDL スクリプトを実行します。
    DROP TABLE person;
    CREATE TABLE person
    (ssn NUMBER(9) PRIMARY KEY,
    fname VARCHAR2(15),
    lname VARCHAR2(20));
    INSERT INTO person VALUES(555662222,'Sam','Goodwin');
    INSERT INTO person VALUES(555882222,'Kent','Clark');
    INSERT INTO person VALUES(666223333,'Jane','Doe');
    COMMIT;
    /
  2. Oracle サーバー上で次のパッケージを作成します。
    CREATE OR REPLACE PACKAGE packperson
    AS
    TYPE tssn is TABLE of NUMBER(10)
    INDEX BY BINARY_INTEGER;
    TYPE tfname is TABLE of VARCHAR2(15)
    INDEX BY BINARY_INTEGER;
    TYPE tlname is TABLE of VARCHAR2(20)
    INDEX BY BINARY_INTEGER;
    PROCEDURE allperson
    (ssn OUT tssn,
    fname OUT tfname,
    lname OUT tlname);
    PROCEDURE oneperson
    (onessn IN NUMBER,
    ssn OUT tssn,
    fname OUT tfname,
    lname OUT tlname);
    END packperson;
    /
  3. Oracle サーバー上で次のパッケージ本体を作成します。
    CREATE OR REPLACE PACKAGE BODY packperson
    AS
    PROCEDURE allperson
    (ssn OUT tssn,
    fname OUT tfname,
    lname OUT tlname)
    IS
    CURSOR person_cur IS
    SELECT ssn, fname, lname
    FROM person;
    percount NUMBER DEFAULT 1;
    BEGIN
    FOR singleperson IN person_cur
    LOOP
    ssn(percount) := singleperson.ssn;
    fname(percount) := singleperson.fname;
    lname(percount) := singleperson.lname;
    percount := percount + 1;
    END LOOP;
    END;
    PROCEDURE oneperson
    (onessn IN NUMBER,
    ssn OUT tssn,
    fname OUT tfname,
    lname OUT tlname)
    IS
    CURSOR person_cur IS
    SELECT ssn, fname, lname
    FROM person
    WHERE ssn = onessn;
    percount NUMBER DEFAULT 1;
    BEGIN
    FOR singleperson IN person_cur
    LOOP
    ssn(percount) := singleperson.ssn;
    fname(percount) := singleperson.fname;
    lname(percount) := singleperson.lname;
    percount := percount + 1;
    END LOOP;
    END;
    END;
    /
  4. Visual Basic 5.0 Enterprise Edition または Visual Basic 6.0 Enterprise Edition で新しいプロジェクトを開きます。デフォルトで、Form1 が作成されます。
  5. フォーム上に次のコントロールを配置します。

    コントロール オブジェクト名 Caption フィールド
    -------------------------------------------------
    ボタン cmdGetEveryone Get Everyone
    ボタン cmdGetOne Get One
  6. [ツール] メニューの [オプション] をクリックします。[モジュール全体を連続表示] チェック ボックスをオンにし、[OK] をクリックします。この設定により、プロジェクトのコード全体を参照できるようになります。
  7. 次のコードをコード ウィンドウに貼り付けます。
    Option Explicit
    Dim Cn As ADODB.Connection
    Dim CPw1 As ADODB.Command
    Dim CPw2 As ADODB.Command
    Dim Rs As ADODB.Recordset
    Dim Conn As String
    Dim QSQL As String
    Dim inputssn As Long
    Private Sub cmdGetEveryone_Click()
    Set Rs.Source = CPw1
    Rs.Open
    While Not Rs.EOF
    MsgBox "Person data: " & Rs(0) & ", " & Rs(1) & ", " & Rs(2)
    Rs.MoveNext
    Wend
    Rs.Close
    End Sub
    Private Sub cmdGetOne_Click()
    Set Rs.Source = CPw2
    inputssn = InputBox("Enter the SSN you wish to retrieve:")
    CPw2(0) = inputssn
    Rs.Open
    MsgBox "Person data: " & Rs(0) & ", " & Rs(1) & ", " & Rs(2)
    Rs.Close
    End Sub
    Private Sub Form_Load()
    'Replace <User ID>, <Password>, and <Server> with the
    'appropriate parameters.
    Conn = "UID=*****;PWD=*****;driver=" _
    & "{Microsoft ODBC for Oracle};SERVER=dseOracle;"
    Set Cn = New ADODB.Connection
    With Cn
    .ConnectionString = Conn
    .CursorLocation = adUseClient
    .Open
    End With
    QSQL = "{call packperson.allperson({resultset 9, ssn, fname, " _
    & "lname})}"
    Set CPw1 = New ADODB.Command
    With CPw1
    Set .ActiveConnection = Cn
    .CommandText = QSQL
    .CommandType = adCmdText
    End With
    QSQL = "{call packperson.oneperson(?,{resultset 2, ssn, fname, " _
    & "lname})}"
    Set CPw2 = New ADODB.Command
    With CPw2
    Set .ActiveConnection = Cn
    .CommandText = QSQL
    .CommandType = adCmdText
    .Parameters.Append .CreateParameter(, adInteger, adParamInput)
    End With
    Set Rs = New ADODB.Recordset
    With Rs
    .CursorType = adOpenStatic
    .LockType = adLockReadOnly
    End With
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
    Cn.Close
    Set Cn = Nothing
    Set CPw1 = Nothing
    Set CPw2 = Nothing
    Set Rs = Nothing
    End Sub
  8. [プロジェクト] メニューの [参照設定] をクリックします。[Microsoft Active Data Objects 2.x Library] チェック ボックスをオンにします。
  9. プロジェクトを実行します。[Get Everyone] をクリックすると、次のクエリが実行されます。
    QSQL = "{call packperson.allperson({resultset 9, ssn, fname, "_
    & "lname})}"
このクエリは、パッケージ "packperson" にあるストアド プロシージャ "allperson" ("packperson.allperson" で参照) を実行します。このストアド プロシージャには入力パラメータがなく、それぞれ 9 個以下のレコードを含む 3 つの配列 (ssn、fname、lname) を返します。サポート技術情報の次の資料で説明されているとおり、ストアド プロシージャから返す行の最大数を指定する必要があります。
174679 Oracle ストアド プロシージャからレコードセットを取得する方法
詳細については、Microsoft ODBC Driver for Oracle に付属のヘルプ ファイル、およびサポート技術情報の資料 174679 を参照してください。


[Get One] をクリックすると、SSN の入力ボックスが表示されます。有効な SSN を入力して [OK] をクリックすると、次のクエリが実行されます。
QSQL = "{call packperson.oneperson(?,{resultset 2, ssn, fname, "_
& "lname})}"
ストアド プロシージャ packperson.oneperson では入力パラメータが 1 つだけ使用されます。このパラメータで、作成するレコード セットの選択基準を指定します。packperson.allperson と同様、レコードセットは、packperson で定義されているテーブル タイプを使用して作成されます。詳細については、サポート技術情報の資料 174679 を参照してください。


: レコードセットを返す Oracle ストアド プロシージャでは、入力パラメータのみを定義できます。出力パラメータは定義できません。


この 2 つのストアド プロシージャは、レコードセットを返すストアド プロシージャの基本的な用途に対応しています。それは、定義済みのレコードセット (すべての人のレコード) を取得すること、および 1 つ以上の入力パラメータに基づくレコードセット (または特定の 1 つのレコード) を取得することです。これらのレコードセットを取得した後、ストアド プロシージャ、またはクライアント上で作成した SQL を使用して、挿入、更新、削除を行うことができます。

関連情報

Microsoft ODBC Driver for Oracle に付属のヘルプ ファイル


『Oracle PL/SQL プログラミング基礎編』、『Oracle PL/SQL プログラミング応用編』 (Steven Feuerstein 著)


『Visual Basic による SQL Server データアクセスガイド』 (William Vaughn 著)


関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
174679 Oracle ストアド プロシージャからレコードセットを取得する方法
175018 Microsoft Oracle ODBC Driver を入手してインストールする方法
174981 Oracle ストアド プロシージャから標準的なレコードセットを取得する方法
167225 [VB5] RDO:Oracle データベースにアクセスする方法

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 176086 (最終更新日 2004-07-15) を基に作成したものです。


この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。
プロパティ

文書番号:176086 - 最終更新日: 2004/12/22 - リビジョン: 1

フィードバック