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

文書翻訳 文書翻訳
文書番号: 176086 - 対象製品
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) の次の資料で説明されている概念に基づいています。
174679Oracle ストアド プロシージャからレコードセットを取得する方法
この資料の内容は、リモート データ オブジェクト (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 アドレスからダウンロードできます。
http://www.microsoft.com/japan/msdn/data/default.asp
この資料は、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日 - リビジョン: 8.2
この資料は以下の製品について記述したものです。
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
  • Microsoft Open Database Connectivity 2.0
  • Microsoft Open Database Connectivity 2.0
  • Microsoft Open Database Connectivity 2.5
  • Microsoft Open Database Connectivity 2.5
  • Microsoft Open Database Connectivity 2.5
  • Microsoft Open Database Connectivity 2.0
  • Microsoft Open Database Connectivity 2.5
  • Microsoft Open Database Connectivity 2.5
  • Microsoft Open Database Connectivity 2.5
  • Microsoft Open Database Connectivity 2.5
  • Microsoft Open Database Connectivity 2.5
  • Microsoft Data Access Components 2.0
  • Microsoft Data Access Components 2.1 Service Pack 2
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.6
  • Microsoft Data Access Components 2.7
キーワード:?
kbhowto kboracle kbdatabase kbdriver KB176086
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com