ID do artigo: 174981 - Última revisão: terça-feira, 13 de julho de 2004 - Revisão: 1.2

Como recuperar o conjunto de resultados típico do Oracle procedimentos armazenados

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

Este artigo mostra como criar um projeto Remote Data Object (RDO) que retorna um Resultset típica de um procedimento armazenado Oracle. Este artigo se baseia nos conceitos abordados no seguinte artigo da Base de dados de Conhecimento Microsoft:
174679  (http://support.microsoft.com/kb/174679/EN-US/ ) : como recuperar o conjunto de resultados do Oracle procedimentos armazenados

Mais Informações

Base de Conhecimento artigo 174679  (http://support.microsoft.com/kb/174679/EN-US/ ) fornece um exemplo detalhado de todas as maneiras possíveis de devolver um Resultset a partir de um procedimento armazenado. O exemplo neste artigo é uma versão simplificada. Consulte 174679  (http://support.microsoft.com/kb/174679/EN-US/ ) se você desejar obter mais informações sobre o processo.

Observação: O conjunto de resultados criados pelo controlador do ODBC da Microsoft para Oracle v2.0 usando procedimentos armazenado Oracle é READ ONLY e STATIC. Para recuperar um Resultset requer que um pacote Oracle ser criado.

O projeto de exemplo neste artigo foi criado no Visual Basic 5.0 e utiliza o RDO para acessar e manipular o conjunto de resultados criados pelo controlador ODBC da Microsoft para Oracle versão 2.0 ou superior. Você precisará ter esse driver para usar o conjunto de resultados - de--procedimentos armazenados funcionalidade discutido neste artigo e KB 174679  (http://support.microsoft.com/kb/174679/EN-US/ ) . (atualmente, ele é o driver somente no mercado que pode retornar um Resultset em um procedimento armazenado). Se você desejar obter mais informações sobre como usar RDO 2.0 com o Oracle, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
167225  (http://support.microsoft.com/kb/167225/EN-US/ ) : como acessar um banco de dados Oracle usando RDO

Este artigo é de duas partes. A primeira parte é um procedimento passo a passo para criar o projeto. A segunda é uma discussão detalhada sobre as partes interessantes do projeto.

Exemplo passo a passo

  1. Execute o script DDL seguinte no servidor Oracle:
          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. Crie o pacote seguinte no servidor 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. Crie o corpo de pacote seguinte no servidor 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. Abra um novo projeto no Visual Basic Enterprise edition. O Form1 é criado por padrão.
  5. Coloque os seguintes controles no formulário:
       Control     Name             Text/Caption
       -----------------------------------------
       Button      cmdGetEveryone   Get Everyone
       Button      cmdGetOne        Get One
    
    						
  6. No menu Ferramentas, selecione o item Opções. Clique na opção "Padrão Visualizar módulo completo" e, em seguida, clique em OK. Isso permite que você exibir todos os o código para este projeto.
  7. Cole o seguinte código na sua janela de código:
          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. Execute o projeto.
Quando você clicar no botão "Get Everyone", ele executa a consulta a seguir:
   QSQL = "{call packperson.allperson({resultset 9, ssn, fname, "_ & "lname})}"
				

Esta consulta está executando o procedimento armazenado "allperson", que está no pacote "packperson" (referenciado como "packperson.allperson"). Há parâmetros de entrada e o procedimento está retornando três matrizes (ssn, fname e sobrenome), cada um com 9 ou menos registros. Conforme mencionado no 174679  (http://support.microsoft.com/kb/174679/EN-US/ ) , você deve especificar o número máximo de linhas que você irá retornar. Consulte o controlador ODBC da Microsoft para Oracle Help File e 174679  (http://support.microsoft.com/kb/174679/EN-US/ ) para obter mais informações sobre esse problema.

Quando você clica no botão "Get One", você verá uma caixa de entrada que solicita um SSN. Depois de inserir um SSN válido e clique em OK, esta consulta é executada:
   QSQL = "{call packperson.oneperson(?,{resultset 2, ssn, fname, "_ & "lname})}"
				

O procedimento armazenado, packperson.oneperson, utiliza um único parâmetro de entrada como critério de seleção para Resultset ele cria. Assim como packperson.allperson, o Resultset é construído usando os tipos de tabela definidos em packperson. (Consulte 174679  (http://support.microsoft.com/kb/174679/EN-US/ ) para obter mais informações.)

Observação: Você só pode definir parâmetros de entrada para procedimentos armazenado Oracle que retornam um Resultset. Não é possível definir parâmetros de saída para esses procedimentos armazenados.

Esses dois rosto procedimentos armazenados o básico usa procedimentos armazenados que retornam o conjunto de resultados. Fornece um primeiro você que um conjunto predefinido de registros (como todos) e o segundo será lhe um conjunto de registros (ou apenas um registro) com base em um ou mais parâmetros de entrada. Depois de ter essas conjunto de resultados, você pode fazer inserções, atualizações e exclusões através de procedimentos armazenados ou SQL que você cria no cliente.

Referências

Driver Microsoft ODBC para Oracle arquivo de Ajuda

Oracle PL/SQL Programming por Steven Feuerstein

Hitchhiker Guide to Visual Basic & SQL Server por William Vaughn

Para obter informações adicionais, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
174679  (http://support.microsoft.com/kb/174679/EN-US/ ) : como recuperar o conjunto de resultados do Oracle procedimentos armazenados

167225  (http://support.microsoft.com/kb/167225/EN-US/ ) : como acessar um banco de dados Oracle usando RDO

175018  (http://support.microsoft.com/kb/175018/EN-US/ ) : como obter e instalar o driver ODBC do Microsoft Oracle

A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbmt kbhowto KB174981 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 174981  (http://support.microsoft.com/kb/174981/en-us/ )