文章編號: 174981 - 上次校閱: 2004年7月13日 - 版次: 1.2

如何從 Oracle 擷取典型 resultsets 預存程序

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文章顯示如何建立遠端資料物件 (RDO) 專案,從 Oracle 預存程序傳回典型的結果集。下列 「 Microsoft 知識庫 」 文件中所涵蓋的概念,將會建置這份文件:
174679? (http://support.microsoft.com/kb/174679/EN-US/ ) : 如何從 Oracle 擷取結果集預存程序

其他相關資訊

Microsoft 知識庫 」 文章 174679? (http://support.microsoft.com/kb/174679/EN-US/ ) 提供深入從預存程序傳回一個結果集的所有可能方法的範例。本文中的範例是簡化的版本。請如果您要處理程序的相關詳細資訊,參閱 174679? (http://support.microsoft.com/kb/174679/EN-US/ )

注意: Microsoft ODBC 驅動程式的 Oracle v2.0 使用 Oracle 預存程序所建立的結果集是請閱讀僅限] 和 [靜態。若要擷取一個結果集,需要建立 Oracle 封裝。

本文中的範例專案 Visual Basic 5.0 所建立,並使用 RDO 存取和操作 2.0 版或更高,由 Microsoft ODBC 驅動程式所建立的 Oracle 版本結果集。您必須有此驅動程式,以使用結果集-此文件,以及 KB 174679? (http://support.microsoft.com/kb/174679/EN-US/ ) 所述的程從-儲存-序功能。(目前,是唯一的驅動程式,可以從預存程序傳回一個結果集的市場上)。如果您想使用 RDO 2.0 與 Oracle 的相關資訊,請參閱 「 Microsoft 知識庫 」 中下列文:
167225? (http://support.microsoft.com/kb/167225/EN-US/ ) : 如何存取使用 RDO 的 Oracle 資料庫

這篇文章是在兩個部分。第一個部分是用於建立專案的逐步程序。第二個是專案的有趣的各個部份的詳細的討論。

雖說是逐步範例

  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,'Sally','Burnett');
    
          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 企業版中開啟一個新的專案。預設會建立 Form1。
  5. 放入以下的控制項在表單上:
       Control     Name             Text/Caption
       -----------------------------------------
       Button      cmdGetEveryone   Get Everyone
       Button      cmdGetOne        Get One
    
    						
  6. 從 [工具] 功能表選取 [選項] 項目]。按一下 「 預設全模組檢視] 的選項,然後按一下 [確定]。這可讓您檢視所有對此專案程式碼。
  7. 下列程式碼貼到您的程式碼視窗:
          Option Explicit
          Dim Cn As rdoConnection
          Dim En As rdoEnvironment
          Dim CPw1 As rdoQuery
          Dim CPw2 As rdoQuery
          Dim Rs As rdoResultset
          Dim Conn As String
          Dim QSQL As String
          Dim tempcnt As Integer
      
          Private Sub cmdGetEveryone_Click()
    
             Set Rs = CPw1.OpenResultset(rdOpenStatic, rdConcurReadOnly)
    
             While Not Rs.EOF
    
                MsgBox "Person data: " & Rs(0) & ", " & Rs(1) & ", " & Rs(2)
                Rs.MoveNext
    
             Wend
    
             Rs.Close
    
             Set Rs = Nothing
    
          End Sub
    
          Private Sub cmdGetOne_Click()
    
             Dim inputssn As Long
    
             inputssn = InputBox("Enter an SSN number:")
    
             CPw2(0) = inputssn
    
             Set Rs = CPw2.OpenResultset(rdOpenStatic, rdConcurReadOnly)
    
             MsgBox "Person data: " & Rs(0) & ", " & Rs(1) & ", " & Rs(2)
    
             Rs.Close
    
             Set Rs = Nothing
    
          End Sub
    
          Private Sub Form_Load()
    
             'Change the text in <> to the appropriate logon
             'information.
             Conn = "UID=<your user ID>;PWD=<your password>;" _
                     & "DRIVER={Microsoft ODBC for Oracle};" _
                     & "SERVER=<your database alias>;"
    
             Set En = rdoEnvironments(0)
             En.CursorDriver = rdUseOdbc
             Set Cn = En.OpenConnection("", rdDriverNoPrompt, False, Conn)
    
             QSQL = "{call packperson.allperson({resultset 9, ssn, fname, " _
                  & "lname})}"
    
             Set CPw1 = Cn.CreateQuery("", QSQL)
    
             QSQL = "{call packperson.oneperson(?,{resultset 2, ssn, fname, " _
                  & "lname})}"
    
             Set CPw2 = Cn.CreateQuery("", QSQL)
    
          End Sub
    
          Private Sub Form_Unload(Cancel As Integer)
    
             En.Close
    
          End Sub
    
    						
  8. 執行專案。
您按一下 ["取得 Everyone"] 按鈕時它會執行下列查詢:
   QSQL = "{call packperson.allperson({resultset 9, ssn, fname, "_ & "lname})}"
				

此查詢執行預存程序 」 allperson,) 」 即套件 」 packperson 」 (packperson.allperson"作為參考)。有沒有輸入的參數和程序正在傳回三個陣列 (ssn、 fname 和 lname) 每個都有 9 或較少的記錄。所述 174679? (http://support.microsoft.com/kb/174679/EN-US/ ) ,您必須指定您將會傳回的資料列最大數目。請參閱 Microsoft ODBC 驅動程式為 Oracle 說明檔] 和 [174679? (http://support.microsoft.com/kb/174679/EN-US/ ) 如需有關這個問題的詳細資訊。

當您按一下"取得一 」 的按鈕上時,您會看到提示您輸入的身份證的輸入的方塊。一旦您輸入有效的身份證,然後按下 [確定] 執行這個查詢:
   QSQL = "{call packperson.oneperson(?,{resultset 2, ssn, fname, "_ & "lname})}"
				

預存程序、 packperson.oneperson、 單一的結果集,它會建立為選取範圍準則輸入參數的用法。就像 packperson.allperson,結果集是使用 packperson 中定義的資料表型別建構的。(請參閱 174679? (http://support.microsoft.com/kb/174679/EN-US/ ) 如需詳細資訊)。

注意: 您只能定義傳回一個結果集的 Oracle 預存程序的輸入的參數。您不能定義這些預存程序的輸出參數。

這些兩個預存程序封面基本會使用傳回結果集的預存程序。第一個可讓您一組預先定義的資料錄 (例如每一個人),第二個會提供您一組記錄 (或只是一筆記錄) 基礎一或多個輸入參數。一旦您結果集有這些您可以執行插入、 更新及刪除透過預存程序或在用戶端建立的 SQL。

?考

Oracle [說明] 檔案的 Microsoft ODBC 驅動程式

由 Steven Feuerstein 先知 PL/SQL 程式設計

威廉 Vaughn 由 Visual Basic (& I) SQL Server 的 hitchhiker 的快速入門

如需詳細資訊請參閱 「 Microsoft 知識庫 」 中下列文:
174679? (http://support.microsoft.com/kb/174679/EN-US/ ) : 如何從 Oracle 擷取結果集預存程序

167225? (http://support.microsoft.com/kb/167225/EN-US/ ) : 如何存取使用 RDO 的 Oracle 資料庫

175018? (http://support.microsoft.com/kb/175018/EN-US/ ) : 如何取得並安裝 Microsoft Oracle ODBC 驅動程式

這篇文章中的資訊適用於:
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Open Database Connectivity 2.0
  • Microsoft Open Database Connectivity 2.0
  • Microsoft Open Database Connectivity 2.0
  • Microsoft Open Database Connectivity 2.0
  • Microsoft Open Database Connectivity 2.5
關鍵字:?
kbmt kbhowto KB174981 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:174981? (http://support.microsoft.com/kb/174981/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。