ADO + Oracle - duvida com StoredProcedure

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

Tonon
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 17 Set 2013 10:56
Localização: Campinas/SP

ADO + Oracle - duvida com StoredProcedure

Mensagem por Tonon »

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

Código: Selecionar todos

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

Código: Selecionar todos

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:

Código: Selecionar todos

	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)

Código: Selecionar todos

	oRs := oCmd:Execute()
Retorna erro:
EXECUTE DISP_E_UNKNOWNNAME


Vendo documentacao propria do ADO
http://msdn.microsoft.com/en-us/library ... s.85).aspx ou
http://msdn.microsoft.com/en-us/library ... s.85).aspx
E fucando na internet, 'teoricamente' meu codigo estaria correto...


Alguem tem uma luz??


Abraco a todos!
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

ADO + Oracle - duvida com StoredProcedure

Mensagem por alxsts »

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)
Tonon
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 17 Set 2013 10:56
Localização: Campinas/SP

ADO + Oracle - duvida com StoredProcedure

Mensagem por Tonon »

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

Código: Selecionar todos

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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

ADO + Oracle - duvida com StoredProcedure

Mensagem por alxsts »

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)
Tonon
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 17 Set 2013 10:56
Localização: Campinas/SP

ADO + Oracle - duvida com StoredProcedure

Mensagem por Tonon »

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:

Código: Selecionar todos

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.
Responder