Artigo: 174981 - Última revisão: terça-feira, 13 de Julho de 2004 - Revisão: 1.2

Como obter conjuntos de resultados típicos 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 | Reduzir tudo

Sumário

Este artigo mostra como criar um projecto RDO (objecto de dados remoto) que devolve um conjunto de resultados típico de um procedimento armazenado Oracle. Este artigo baseia-se em conceitos abrangidos no seguinte artigo da base de dados de conhecimento da Microsoft:
174679  (http://support.microsoft.com/kb/174679/EN-US/ ) : como obter conjuntos de resultados de Oracle procedimentos armazenados

Mais Informação

De artigo da base de dados de conhecimento da Microsoft 174679  (http://support.microsoft.com/kb/174679/EN-US/ ) dá um exemplo detalhado de todas as formas possíveis de devolver um conjunto de resultados 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 pretender obter mais informações sobre o processo.

NOTA: Os conjuntos de resultados criados pelo controlador de ODBC da Microsoft para Oracle v2.0 utilizando procedimentos armazenado Oracle são READ ONLY e estático. Para obter um conjunto de resultados requer que um pacote Oracle ser criado.

O projecto de exemplo neste artigo foi criado no Visual Basic 5.0 e utiliza o RDO para aceder e manipular os conjuntos de resultados criados pelo controlador ODBC da Microsoft para Oracle versão 2.0 ou superior. Tem de ter este controlador para utilizar conjuntos de resultados - funcionalidade de--procedimentos armazenados discutida neste artigo e KB 174679  (http://support.microsoft.com/kb/174679/EN-US/ ) . (actualmente, é o único controlador no mercado que pode devolver um conjunto de resultados a partir de um procedimento armazenado). Se pretender mais informações sobre como utilizar o RDO 2.0 com Oracle, consulte o seguinte artigo na base de dados de conhecimento da Microsoft:
167225  (http://support.microsoft.com/kb/167225/EN-US/ ) : como aceder a uma base de dados Oracle utilizando RDO

Este artigo é em duas partes. A primeira parte é um procedimento passo-a-passo para criar o projecto. A segunda é um debate detalhado sobre as partes interessantes do projecto.

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 projecto novo no Visual Basic Enterprise edition. É criado o Form1 por predefinição.
  5. Coloque os seguintes controlos no formulário:
       Control     Name             Text/Caption
       -----------------------------------------
       Button      cmdGetEveryone   Get Everyone
       Button      cmdGetOne        Get One
    
    						
  6. No menu Ferramentas, seleccione o item Opções. Clique na opção "Default Full Module View" e, em seguida, clique em OK. Isto permite visualizar todo o código para este projecto.
  7. Cole o código seguinte na 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 projecto.
Quando clica no botão "Get Everyone", executa a consulta seguinte:
   QSQL = "{call packperson.allperson({resultset 9, ssn, fname, "_ & "lname})}"
				

Esta consulta está a executar o procedimento armazenado "allperson", que é o pacote "packperson" (referenciado como "packperson.allperson"). Existem parâmetros de entrada e o procedimento está a devolver três matrizes (nss, fname e lname), cada um com o 9 ou menos registos. Conforme indicado no 174679  (http://support.microsoft.com/kb/174679/EN-US/ ) , tem de especificar o número máximo de linhas que irá devolver. Consulte o controlador ODBC da Microsoft para Oracle ficheiro de ajuda e 174679  (http://support.microsoft.com/kb/174679/EN-US/ ) para obter mais informações sobre este problema.

Quando clica no botão "Get One", é apresentada uma caixa de entrada que pede um SSN. Depois de introduzir 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 selecção para o conjunto de resultados que cria. Tal como packperson.allperson, o conjunto de resultados é construído utilizando os tipos de tabela definidos em packperson. (Consulte 174679  (http://support.microsoft.com/kb/174679/EN-US/ ) para obter mais informações.)

NOTA: Só É possível definir parâmetros de entrada para procedimentos armazenado Oracle que devolvam um conjunto de resultados. Não é possível definir parâmetros de saída para estes procedimentos armazenados.

Estes dois capa de procedimentos armazenados o básico utiliza de procedimentos armazenados que devolvem conjuntos de resultados. Permite primeiro um que é um conjunto predefinido de registos (como todos os utilizadores) e o segundo lhe um conjunto de registos (ou apenas um registo) com base num ou mais parâmetros de entrada. Quando tiver estes conjuntos de resultados, pode efectuar inserções, actualizações e eliminações através de procedimentos armazenados ou SQL que criar no cliente.

Referências

Controlador Microsoft ODBC para Oracle ficheiro de ajuda

Oracle PL/SQL Programming por Steven Feuerstein

Guide do Hitchhiker 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 obter conjuntos de resultados de Oracle procedimentos armazenados

167225  (http://support.microsoft.com/kb/167225/EN-US/ ) : como aceder a uma base de dados Oracle utilizando RDO

175018  (http://support.microsoft.com/kb/175018/EN-US/ ) : como adquirir e instalar o controlador de ODBC 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )