Clipper On Line • Ver Tópico - ADO + Oracle - duvida com StoredProcedure

ADO + Oracle - duvida com StoredProcedure

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

ADO + Oracle - duvida com StoredProcedure

Mensagempor Tonon » 17 Set 2013 11:24

Bom dia a todos!

Acompanho o forum ha muito tempo (meu teclado nao esta acentuando, desculpem por isso). Usar VM WinXP eh osso...

Desde sempre utilizei linux + xhb.com + sqlrdd + oracle11g. Agora estou tentando ha varias semanas usar stored procedures e venho tendo problemas. Como muitos sabem, suporte simplesmente nao existe. No maximo o Luiz vez ou outra responde uma duvida com 2 perguntas totalmente fora de contexto... e isso vai se arrastando por meses e meses... como sempre.

Sei que tem amigos aqui que usam SQLRdd com sucesso (como tambem uso). Nao vim aqui para criticar a ferramenta.

Indo ao assunto:

Estou tentando usar win+harbour+ADO para acessar o Oracle.

Estou aprendendo sobre ADO... estou apanhando BASTANTE. Ja li todas mensagens do grupo, sintetizei bastante coisa interessante e continuo fazendo testes...

Com querys e recordsets, tudo bem... mas estou tentando passar parametros para uma procedure e retorna erro

TRY
   oCnn := CreateObject( "ADODB.Connection" )
   oRs  := CreateObject( "ADODB.RecordSet" )
   oCmd := CreateObject( "ADODB.Command" )
   
   oCnn:ConnectionString := "Provider=OraOLEDB.Oracle;Data Source=oDS;User ID=oUSR;Password=oPWD;FetchSize=100;CacheType=Memory;PLSQLRSet=True;"
   oCnn:Open()
   oCmd:CommandText      := "prc_saldo_cc"
   oCmd:CommandType      := adCmdStoredProc
   oCmd:ActiveConnection := oCnn
   oCmd:Parameters:Refresh()
   oPrm1 := oCmd:CreateParameter("cVend",adVarChar,adParamInput)
   oPrm1:Value := "0230"
   oPrm2 := oCmd:CreateParameter("cFilial",adVarChar,adParamInput)
   oPrm2:Value := "00"
   oPrm3 := oCmd:CreateParameter("cDataIni",adVarChar,adParamInput)
   oPrm3:Value := "20100101"
   oPrm4 := oCmd:CreateParameter("cDataFim",adVarChar,adParamInput)
   oPrm4:Value := "20130930"
   oPrm5 := oCmd:CreateParameter("result",adDouble,adParamReturnValue)



No
oCmd:Parameters:Refresh()


o obj oErr retorna: REFRESH DISP_E_BADPARAMCOUNT

Ai eu retiro esse trecho... passa normalmente...

Quando coloco isso no final do codigo:
   oCmd:Parameters:Append(oPrm1)

Retorna erro:
APPEND DISP_E_BADPARAMCOUNT

Se eu pulo o Append e vou direto ao Execute (independente de parametro ou nao)
   oRs := oCmd:Execute()

Retorna erro:
EXECUTE DISP_E_UNKNOWNNAME

Vendo documentacao propria do ADO
http://msdn.microsoft.com/en-us/library/windows/desktop/ms676516(v=vs.85).aspx ou
http://msdn.microsoft.com/en-us/library/windows/desktop/ms675101(v=vs.85).aspx
E fucando na internet, 'teoricamente' meu codigo estaria correto...

Alguem tem uma luz??

Abraco a todos!
Tonon
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 4
Data de registro: 17 Set 2013 10:56
Cidade/Estado: Campinas/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

ADO + Oracle - duvida com StoredProcedure

Mensagempor alxsts » 17 Set 2013 18:20

Olá!

Seja bem-vindo ao Fórum Tonon!

Creio que este tópico irá ajudá-lo a resolver o problema.

Utilize sempre a busca do fórum.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

ADO + Oracle - duvida com StoredProcedure

Mensagempor Tonon » 18 Set 2013 08:33

alxsts, obrigado pela ajuda.

Mas... como descrito no código que eu mandei, está praticamente igual ao exemplo do forum... pesquisei exaustivamente aqui no forum... peguei uma idéia aqui e acolá (conforme pode ver, meu código estava praticamente igual ao da postagem)... mas infelizmente não funciona ainda.

Fiz algumas mudanças... e ainda nada. Retorna os mesmos erros.

A única diferença drástica do meu código com o exemplo cidado é que se eu usar o Win_OleCreateObject não compila... e eu estou usando o CommandType:=adCmdStoredProc (conforme vários outros usam também)...

Ademais, é tudo igual... e não consigo rodar. Continua dando erro no Append DISP_E_BADPARAMCOUNT

TRY
   oCnn := CreateObject( "ADODB.Connection" )
   oRs  := CreateObject( "ADODB.RecordSet" )
   oCmd := CreateObject( "ADODB.Command" )

   oCnn:ConnectionString := "Provider=OraOLEDB.Oracle;Data Source=oDS;User ID=oUSR;Password=oPWD;FetchSize=100;CacheType=Memory;PLSQLRSet=True;"
   oCnn:Open()

   oCmd:CommandText      := "prc_cml_saldo_cc"
   oCmd:CommandType      := adCmdStoredProc
   oCmd:ActiveConnection := oCnn
   oCmd:Parameters:Append( oCmd:CreateParameter(,adVarChar,adParamInput,,"0230") )
   oCmd:Parameters:Append( oCmd:CreateParameter(,adVarChar,adParamInput,,"00") )
   oCmd:Parameters:Append( oCmd:CreateParameter(,adVarChar,adParamInput,,"20100101") )
   oCmd:Parameters:Append( oCmd:CreateParameter(,adVarChar,adParamInput,,"20130930") )
   oCmd:Parameters:Append( oCmd:CreateParameter(,adDouble,adParamReturnValue) )

        oRs := oCmd:Execute()
   oCn:Close()
   oCn := Nil



Att.

Tonon
Tonon
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 4
Data de registro: 17 Set 2013 10:56
Cidade/Estado: Campinas/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

ADO + Oracle - duvida com StoredProcedure

Mensagempor alxsts » 18 Set 2013 12:01

Olá!

Pela descrição do erro, parece que o número de parâmetros que está sendo passado para a procedure é diferente da quantidade de parâmetros que ela espera. Você verificou isso?
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

ADO + Oracle - duvida com StoredProcedure

Mensagempor Tonon » 18 Set 2013 13:27

Sim Alexandre... poderia ser isso sim.

Conforme documentação:
http://msdn.microsoft.com/en-us/library/cc704587.aspx
Esse erro é quando a quantidade de parâmetros é inválida...

Mas tenho 4 parâmetros IN e 1 OUT na procedure.

Independente de colocar 4 Append ou 5 Append (conforme demonstrado no 1o exemplo), o erro é o mesmo... O erro dá sempre no 1º parâmetro que tento dar append, indiferente de qual.

Por isso até a idéia inicial de colocar o oCmd:Parameters:Refresh... que pelo que eu vi na documentação é para deixar o oCmd:Parameters já preparado com os padrões próprios da stored procedure... mas pelo jeito não há suporte para o Refresh...

Minha procedure:
create or replace PROCEDURE cml_saldo_cc
(
  cVend     in     vend.cod%type,
  cFilial   in     vend.filial%type,
  cDataIni  in     VARCHAR2,
  cDataFim  in     VARCHAR2,
  nSaldo       out cc.valor%type
) AS

  cConexao VARCHAR2(40);
  nSaldoAnt cc.sdant%type;
  nSaldoAt  ccsdant%type;

BEGIN

  select conexao into cConexao from empresa where filial = cFilial;
  execute immediate 'select sum ( case when d_c = ''D'' then valor*-1 else valor end ) as valor  from '||cConexao||'.cc  where cod = '||cVend||' and datax >= to_date('''||cDataIni||''',''YYYYMMDD'') and datax <= to_date('''||cDataFim||''',''YYYYMMDD'')' into nSaldoAt;
  execute immediate 'select sdant from '||cConexao||'.vend  where cod = '||cVend||'' into nSaldoAnt;

  nSaldo := nSaldoAnt + nSaldoAt;
  dbms_output.put_line(nSaldo);
 
END cml_saldo_cc;


Att.
Tonon
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 4
Data de registro: 17 Set 2013 10:56
Cidade/Estado: Campinas/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez




Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 12 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro