Página 1 de 1

Acessar Banco Oracle

Enviado: 28 Jul 2008 18:45
por asimoes
Pessoal,

Estou usando o exemplo abaixo para acessar tabelas do oracle, já consigo conectar e selecionar as tabelas.
O problema é o seguinte, tenho duas tabelas que estou fazendo um "join" e o resultado disto é +- 2000000 (dois milhões de registros)
Mas no laço "do while ! oRecordSet:Eof" só me retorna 1900 linhas. Tem que setar alguma variável? O que deve estar acontecendo?
Detalhe: quando eu faço um select count(*) das tabelas envolvidas, e exibo o resultado: "? oRecordSet:Fields(0):value" os 2000000 são exibidos!, mas no loop não mostra tudo somente 1900 linhas.

Código: Selecionar todos

    #include "ado.ch"

    PROCEDURE Main()
        Local i := 1
        //Local oConnection := TOLEAUTO():New("adodb.connection")
        //Local oRecordset := TOLEAUTO():New("adodb.recordset")

        Local oConnection := CREATEOBJECT( "adodb.connection" )
        Local oRecordset := CREATEOBJECT("adodb.recordset")

        ? "Connecting..."
        oConnection:Open("Provider=OraOLEDB.Oracle;Data Source=OAIP;User ID=system;Password=filter88;")

        ? "Quering..."
        oRecordSet:CursorType := adOpenForwardOnly
        oRecordSet:ActiveConnection(oConnection)
        oRecordSet:Source := "select v.codemp, e.nome from vendas v, empregados e where v.codemp = e.codemp"
        oRecordSet:Open()

        oRecordSet:MoveFirst()
        
        do while  ! oRecordSet:Eof
            ? oRecordSet:Fields(0):value
            oRecordSet:Move(++i)
        enddo

        wait
    RETURN

Re: Acessar Banco Oracle

Enviado: 30 Jul 2008 09:29
por asimoes
Alguém pode me ajudar?
:xau

Re: Acessar Banco Oracle

Enviado: 30 Jul 2008 11:05
por rodrmigu
Olá

Tente este código:

Código: Selecionar todos

#include "ado.ch"

PROCEDURE Main()
    Local i := 1

    Local oConnection := CREATEOBJECT( "adodb.connection" )
    Local oRecordset := CREATEOBJECT("adodb.recordset")

    ? "Connecting..."
    oConnection:Open("Provider=OraOLEDB.Oracle;Data Source=XE;User ID=system;Password=manager;FetchSize=100;CacheType=Memory;")

    ? "Quering..."
    oRecordSet:CursorType := adOpenForwardOnly 
    oRecordSet:ActiveConnection(oConnection)
    oRecordSet:CursorType = adOpenForwardOnly
    oRecordSet:CursorLocation = adUseServer
    oRecordSet:MaxRecords = 100000
    oRecordSet:CacheSize = 100

    oRecordSet:Source := "select table_name from dba_tables"
    oRecordSet:Open()

    oRecordSet:MoveFirst()

    do while  ! oRecordSet:Eof
        ? i++, oRecordSet:Fields(0):value
        oRecordSet:MoveNext()
    enddo

    wait
RETURN
Note também que o CacheType pode ser Memory ou File

[]'s
Rodrigo

Re: Acessar Banco Oracle

Enviado: 30 Jul 2008 13:03
por asimoes
Rodrigo,

Muito Bom!

Funcionou com as suas dicas, uma outra pergunta, com relação a execução de stored procedures, você tem algum exemplo?

[]´s

Alexandre

Re: Acessar Banco Oracle

Enviado: 30 Jul 2008 19:33
por rodrmigu
Olá Alexandre,

Não tenho, mas seria algo do tipo

"EXEC Minha_Stored_proc" ou "Begin; Minha_Proc; End;"

Vc também pode ao inves de usar StoredProcedures, cria-las como função e chama-las assim:

"Select Minha_Func() From dual;"

Mas dá uma olhada nesta documentação, deve te ajudar:

http://download.oracle.com/docs/cd/B193 ... 11/toc.htm

[]'s
Rodrigo

Acessar Banco Oracle

Enviado: 04 Abr 2013 11:34
por emiliocorova
Bom dia Rodrigo,

Com este mesmo exemplo, teriamos como jogar isto em uma Grid do HMG?

Obrigado

Acessar Banco Oracle

Enviado: 04 Abr 2013 12:39
por alxsts
Olá!

Seja bem-vindo ao fórum Emílio!

É possível sim. Uma das formas é carregar o record set para um array e atribuir este array ao ITENS da Grid:

Código: Selecionar todos

   LOCAL aRows := {}

   If ! oRs:Eof()
      aRows := oRs:getRows()
   Endif
   
      @ 10,10 GRID Grid_1 ;
         WIDTH 620 ;
         HEIGHT 330 ;
         HEADERS {'Column 1','Column 2','Column 3','Column 4','Column 5'} ;
         WIDTHS {140,140,140,140,140} ;
         ITEMS aRows ;
         EDIT ;
         COLUMNCONTROLS { {'TEXTBOX','NUMERIC','$ 999,999.99'} , {'DATEPICKER','DROPDOWN'} , {'COMBOBOX',{'One','Two','Three'}} , { 'SPINNER' , 1 , 20 } , { 'CHECKBOX' , 'Yes' , 'No' } } ;
         DYNAMICFORECOLOR { fColor , fColor, fColor, fColor, fColor }  ;
         ON CHANGE PlayBeep()
Pesquise nos exemplos da HMG para outras formas. A busca do fórum também ajuda muito.

Acessar Banco Oracle

Enviado: 04 Abr 2013 13:11
por emiliocorova
Maravilha, muito obrigado.

Acessar Banco Oracle

Enviado: 04 Abr 2013 13:28
por alxsts
Olá!

Pode também carregar a GRID "manualmente:

Código: Selecionar todos

Procedure GridLoad( oRs )
   Main.grid_1.deleteallitems
   if oRs:recordcount > 0
      oRs:Movefirst()
      do while !oRs:eof()
         main.grid_1.additem( {  oRs:fields('id'):value,;
                           oRs:fields('texto'):value,;  
                           oRs:fields('numero'):value,;
                           oRs:fields('data'):value,;
                           oRs:fields('logico'):value,;
                           oRs:fields('memo'):value })
         oRs:movenext()
      enddo
      oRs:Movefirst()
   endif
   main.grid_1.value := 1
   main.grid_1.setfocus                         
Return