Executar Stored Procedure do Oracle

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Executar Stored Procedure do Oracle

Mensagem por asimoes »

Pessoal,

Estou com dificuldade em achar os comandos certos para executar uma stored procedure do oracle, alguém tem algum exemplo? ou onde eu encontro a documentação do ado com relação aos seus comendos exemplo:

oRecordSet:Open() // Quais parâmetros são passados, enfim todos os comandos sql para o ado.

[]´s :)Pos
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
rodrmigu
Usuário Nível 3
Usuário Nível 3
Mensagens: 150
Registrado em: 27 Nov 2007 15:13
Localização: Indaiatuba SP

Re: Executar Stored Procedure do Oracle

Mensagem por rodrmigu »

Alexandre,

Tente assim:

oRecordSet:Source := "BEGIN credit_account(123, 40); END;"
oRecordSet:Execute()

ou

oRecordSet:CommandText = "BEGIN credit_account(123, 40); END;"
oRecordSet:Execute()

[]'s
Rodrigo
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Executar Stored Procedure do Oracle

Mensagem por asimoes »

Olá Rodrigo,

Obrigado pela dica, vou tentar estes exemplos, qualquer problema retorno aqui.
Outra coisa, o resultado da execução da stored procedure, como é? tem que atribuir para algum vetor?

[]´s

Alexandre
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
rodrmigu
Usuário Nível 3
Usuário Nível 3
Mensagens: 150
Registrado em: 27 Nov 2007 15:13
Localização: Indaiatuba SP

Re: Executar Stored Procedure do Oracle

Mensagem por rodrmigu »

Olá Alexandre,

Na StoredProcedure, vc precisa usar o retorno na passagem de parametros, como OUT, por isso que prefiro criar a SP como função, daí vc pode mandar o resultado num simples Return.

Naquele link que te passei, tem uns exemplos (meio complicados) de como pegar resultados atraves da passagem de parametros.

[]'s
Rodrigo
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Executar Stored Procedure do Oracle

Mensagem por asimoes »

Rodrigo,

Seguindo o exemplo, está acontecendo um erro que não estou conseguindo resolver:

Código: Selecionar todos


#include "adordd.ch"

    PROCEDURE Main()
        Local i := 1

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

        ? "Connecting..."
        oConnection:Open("Provider=OraOLEDB.Oracle;Data Source=DS01;User ID=itbi;Password=itbi;FetchSize=100;CacheType=Memory;PLSQLRSet=1;")

        ? "Quering..."
        oRecordSet:CursorType := adOpenDynamic
        oRecordSet:ActiveConnection(oConnection)
        //oRecordSet:MaxRecords = 100000
        oRecordSet:CacheSize = 100

        oRecordSet:Source("BEGIN ITBI.UTIL.BUSCA_UNIFUFIR_RS(to_date('31/01/2008','dd/mm/yyyy'); END;")

        oRecordSet:Execute()

    RETURN



Me retorna o seguinte erro:

Error adodb.recordset/6 DISP_E_UNKNOWNNAME: EXECUTE Arguments: ()

Error at ...: TOLEAUTO:EXECUTE(0) in Module: source\rtl\win32ole.prg
Called from : MAIN(20) in Module: ORACLE.PRG





Error adodb.recordset/6 DISP_E_UNKNOWNNAME: EXECUTE

Código: Selecionar todos

HbMake v1.20 - xHarbour Make Utility
Copyright (C) 2000-2007 xHarbour project - http://www.xharbour.org
xHarbour build 1.1.0 Intl. (SimpLex) (Rev. 6180) / Borland C++ 5.5.1 (32 bit)

     Compiling :
     +------------[   0% ]--------------+
     ¦                                  ¦
     +----------------------------------+

D:\BORLAND\B+------------------------------------------------------+
Turbo Increm¦ Error adodb.recordset/6  DISP_E_UNKNOWNNAME: EXECUTE ¦
            ¦                     Arguments: ()                    ¦
D:\Harbour\o¦                                                      ¦
            ¦                         Quit                         ¦
Connecting..+------------------------------------------------------+
Quering...
Error adodb.recordset/6  DISP_E_UNKNOWNNAME: EXECUTE Arguments: ()

Error at ...: TOLEAUTO:EXECUTE(0) in Module: source\rtl\win32ole.prg
Called from : MAIN(20) in Module: ORACLE.PRG

D:\Harbour\oracle>oracle

Connecting...
Quering...
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
rodrmigu
Usuário Nível 3
Usuário Nível 3
Mensagens: 150
Registrado em: 27 Nov 2007 15:13
Localização: Indaiatuba SP

Re: Executar Stored Procedure do Oracle

Mensagem por rodrmigu »

Alexandre,

Não sei o que está acontecendo, talvez não seja o Execute(), talvez seja algum outro método, precisaria descobrir quais os métodos que podem ser usados com o ADO.

[]'s
ROdrigo
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Executar Stored Procedure do Oracle

Mensagem por rochinha »

Amiguinho

Neste topico eu uso muitos dos metodos do ADO, verifique como usa-los:

viewtopic.php?f=34&t=6772&st=0&sk=t&sd=a&hilit=adoxb
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Executar Stored Procedure do Oracle

Mensagem por asimoes »

Olá Rochinha,

O nosso problema é agora substituir o oraclip (conhece?) para podermos migrar para o xharbour, precisamos encontrar a solução para execução de storeds procedures, onde as regras de negócio estão no banco.
Não achei nada na internet com relação a isso, o nosso amigo Rodrigo me passou alguns exemplos, mas infelizmente não obtive sucesso. Você conhece o SQLRDD? será que ele tem esta funcionalidade para o oracle?

[]´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Executar Stored Procedure do Oracle

Mensagem por sygecom »

A SQLRDD é uma LIB paga, pelo SITE deles diz que funciona com ORACLE, mais detalhes entre no site do xharbour.com.br
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Executar Stored Procedure do Oracle

Mensagem por asimoes »

Olá Leonardo,

Eu já baixei o demo da sqllib comercial e não vi nada na documentação, embora diga que o rdd é nativo, mas exemplos, funções para executar um sp não vi.

Alexandre
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
rodrmigu
Usuário Nível 3
Usuário Nível 3
Mensagens: 150
Registrado em: 27 Nov 2007 15:13
Localização: Indaiatuba SP

Re: Executar Stored Procedure do Oracle

Mensagem por rodrmigu »

Alexandre,

uma outra solução seria testar o odbc da oracle. Eu fiz uns testes com linux e windows usando a TOdbc e gostei do resultado.

Abaixo segue um exemplo que modifiquei e peguei dos testes

[]'s
Rodrigo

Código: Selecionar todos


FUNCTION Main()
   LOCAL aOrders
   LOCAL nOp
   LOCAL dsFunctions
   LOCAL cConStr
   LOCAL cDir
   LOCAL hEnv

   //hb_FNameSplit( hb_ArgV( 0 ), @cDir )
   //cConStr := "DBQ=" + hb_FNameMerge( cDir, "harbour.mdb" ) + ";Driver={Microsoft Access Driver (*.mdb)}"

   dsFunctions := TODBC():New( 'TEST', 'SYSTEM', 'MANAGER' )

   SET COLOR TO "W+/B"
   CLS

   WHILE .T.

      @ 00, 00 SAY padc( "þ TODBC Demonstration þ", 80 ) COLOR "B/W"

      dsFunctions:SetSQL( "SELECT * FROM dba_users" )
      dsFunctions:Open()

      @ 03, 24 TO len( dsFunctions:Fields ) + 4, 55

      aOrders := {}
      FOR i := 1 TO len( dsFunctions:Fields )

         aadd( aOrders, dsFunctions:Fields[ i ] :FieldName )
         @ i + 3, 25 PROMPT padc( "ORDER BY " + aOrders[ i ], 30 )

      NEXT

      MENU TO nOp

      IF nOp == 0
         EXIT
      ENDIF

      dsFunctions:Close()

      dsFunctions:SetSQL( "SELECT * FROM dba_users ORDER BY " + aOrders[ nOp ] )
      dsFunctions:Open()

      FOR i := 11 TO 24
         @ i, 00 SAY REPL( " ", 80 )
      NEXT

      @ 10, 00 TO 10, 79
      @ 24, 00 TO 24, 79
      @ 12, 00 TO 12, 79
      @ 11, 00 SAY ""

      @ 11, 02        SAY "Statement:"     COLOR "GR+/B"
      @ 11, col() + 1 SAY dsFunctions:cSQL

      @ 14, 05 SAY " " + padr( dsFunctions:FieldByName( "username" ) :FieldName, 3 ) + "   " + ;
              padr( dsFunctions:FieldByName( "password" ) :FieldName, 15 ) + "   " + ;
              padr( dsFunctions:FieldByName( "account_status" ) :FieldName, 2 ) + "   " + ;
              padr( dsFunctions:FieldByName( "default_tablespace" ) :FieldName, 40 ) ;
              COLOR "B/W"

      WHILE !dsFunctions:Eof()
         ? "      " + padr( dsFunctions:FieldByName( "username" ) :Value, 3 ), "³", ;
                            padr( dsFunctions:FieldByName( "password" ) :Value, 15 ), "³", ;
                            padr( dsFunctions:FieldByName( "account_status" ) :Value, 2 ), "³", ;
                            padr( dsFunctions:FieldByName( "default_tablespace" ) :Value, 40 )
         dsFunctions:Skip()
      ENDDO

      dsFunctions:Close()

   ENDDO
   dsFunctions:Destroy()

RETURN ( NIL )
Responder