Stored Procedure retornando parametro para o Delphi

Delphi

02/08/2005

Pessoal possuo um arquitetura em 3 camadas, com dbexpress e DCOM.

Fiz uma stored procedure em PL/SQL(Oracle) que me retorna um parametro do tipo String;

O problema é que não consigo acessar esse parametro no Delphi.

estou fazendo da sequinte forma:

try
dmCAQ.cdsCAQCopiaFT.FetchParams;
{ Os parametros abaixo são IN }
dmCAQ.cdsCAQCopiaFT.Params[0].Value := edtDescFT.Text;
dmCAQ.cdsCAQCopiaFT.Params[1].Value := edtCodEmpOrig.Text;
dmCAQ.cdsCAQCopiaFT.Params[2].Value := edtCodItemOrig.Text;
dmCAQ.cdsCAQCopiaFT.Params[3].Value := edtCodEmpDest.Text;
dmCAQ.cdsCAQCopiaFT.Params[4].Value := edtCodItemDest.Text;
{Esse proximo parametro é o de retorno OUT }
dmCAQ.cdsCAQCopiaFT.Params[5].Value := v_new_cod_ft;
dmCAQ.cdsCAQCopiaFT.Execute;
showMessage(´Copia gerada com sucesso !´);
edtCodFT.Text := v_new_cod_ft;
except
showMessage(´Problemas com a copia da Ficha Técnica !´);
end;

No dmCAQ.cdsCAQCopiaFT.execute da o sequinte erro:
´dbExpress : Invalid Parameter´;

Alguém sabe como posso acessar esse parametro ?


Mascotepc

Mascotepc

Curtidas 0

Respostas

Rjun

Rjun

02/08/2005

Posta o inicio da sua STP onde você declara os parâmetros.


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

CREATE PROCEDURE stp_caq_copiaFT(desc_nova_ft IN VARCHAR2,
cod_emp_origem IN VARCHAR2,
cod_item_origem IN VARCHAR2,
cod_emp_destino IN VARCHAR2,
cod_item_destino IN VARCHAR2,
new_cod_ft OUT VARCHAR2)
AS BEGIN


GOSTEI 0
Rjun

Rjun

02/08/2005

´dbExpress : Invalid Parameter´;


A mensagem é só essa ou tem algo mais?


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

dbExpress Error : Invalid Parameter - Somente isso !


GOSTEI 0
Rjun

Rjun

02/08/2005

A variável [b:0b462b96f5]v_new_cod_ft[/b:0b462b96f5] tem algum valor?


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Não a variavel não possui nenhum valor !


GOSTEI 0
Rjun

Rjun

02/08/2005

Eu não conheço Oracle mas no MSSQL quando o parâmetro é de saida deve-se colocar OUTPUT após a declaração do parâmetro.

Se v_new_cod_ft não tem valor então a linha que você faz a atribuição não tem necessidade de existir.

Para você obter o valor do parâmetro após a execução da stp faça o seguinte :

edtCodFT.Text := dmCAQ.cdsCAQCopiaFT.Params[5].Value;


No DBExpress com Oracle não tem ParamByName?


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Em Oracle para se declarar um parametro de retorno basta colocar a clausula OUT depois do seu nome.

Tentei fazer dessa forma, executar a Stored sem atribuir nada a esse paramentor e deu o mesmo erro na hora de EXECUÇÃO : ´DBExpress Error : Invalid Parameter´.

Sim ! DBExpress com Oracle posssui ParamByName !


GOSTEI 0
Rjun

Rjun

02/08/2005

Eu prefiro usar parambyname. Fica mais claro o q está se fazendo.

Bom, vc usa o parâmetro durante a STP ou ele só recebe um valor para retornar a aplicação?


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Só recebe um valor para retonar a aplicação !

Inicialmente fiz a STP sem esse parametro de retorno e funcionou perfeitamente. Só que ai surgiu a necessiade do retorno. Ai Criei este parametro para que possa retornar para a aplicação. Nos componentes do Delphi o parametro aparece normalmente, tanto no TSQLStoredProc do Servidor quanto no ClientDataSet do Cliente.


GOSTEI 0
Rjun

Rjun

02/08/2005

Vc ja executou a STP no Oracle pra ver se esta tudo OK?


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Sim executei no SQL*Plus e o retorno vem de maneira correta !


GOSTEI 0
Rjun

Rjun

02/08/2005

Verifique se no TSQLStoredProc o parâmetro esta mercado como ptOutput.


GOSTEI 0
Massuda

Massuda

02/08/2005

Eu não trabalho muito com BD, mas, fora o que o rjun escreveu, acho que como o parâmetro é do tipo output, você não pode atribuir um valor a ele antes de executar:
dmCAQ.cdsCAQCopiaFT.Params[5].Value := v_new_cod_ft;



GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Sim tanto no Servidor como Cliente está como ptOutput !


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Sim ! Tanto no Servidor como no Cliente o parametro esta como ptOutput !


GOSTEI 0
Rjun

Rjun

02/08/2005

Você retirou a linha em que estava fazendo a atribuição pro parametro 5?


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Sim Retirei !

Da o mesmo erro !

Olha como esta agora :

try
dmCAQ.cdsCAQCopiaFT.FetchParams;
dmCAQ.cdsCAQCopiaFT.Params[0].Value := edtDescFT.Text;
dmCAQ.cdsCAQCopiaFT.Params[1].Value := edtCodEmpOrig.Text;
dmCAQ.cdsCAQCopiaFT.Params[2].Value := edtCodItemOrig.Text;
dmCAQ.cdsCAQCopiaFT.Params[3].Value := edtCodEmpDest.Text;
dmCAQ.cdsCAQCopiaFT.Params[4].Value := edtCodItemDest.Text;
dmCAQ.cdsCAQCopiaFT.Execute;
showMessage(´Copia gerada com sucesso !´);
edtCodFT.Text := dmCAQ.cdsCAQCopiaFT.Params[5].Value;
except
showMessage(´Problemas com a copia da Ficha Técnica.´)
end;


GOSTEI 0
Rjun

Rjun

02/08/2005

Cara, já não sei mais o q pode ser. Se ainda esta dando erro, verifique se os outros parametros estão como pdInput.


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Olhei os outros paramentros e eles estão como ptInput, será que é problema de DataType ?


GOSTEI 0
Rjun

Rjun

02/08/2005

Sinceramente não sei, mas pode ser q de certo. O erro acontece durante a execução da STP?


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Sim o erro ocore quando dou o Execute no ClientDataSet !


GOSTEI 0
Rjun

Rjun

02/08/2005

Tente fazer o seguinte, delete os parametros e crie-os de novo. Vc ja tentou mudar para parambyname?


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Recrei os parametros. Utilizei o ParamByName e deu o mesmo erro !


GOSTEI 0
Rjun

Rjun

02/08/2005

Posta o código de novo, agora com parambyname. Vc verificou os tipos dos parametros? Estão todos como String?


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Sim os parametros estão todos como String !

try
cdsCAQCopiaFT.FetchParams;
cdsCAQCopiaFT.Params.ParamByName(´desc_nova_ft´).Value := edtDescFT.Text;
cdsCAQCopiaFT.Params.ParamByName(´cod_emp_origem´).Value := edtCodEmpOrig.Text;
cdsCAQCopiaFT.Params.ParamByName(´cod_item_origem´).Value := edtCodItemOrig.Text;
cdsCAQCopiaFT.Params.ParamByName(´cod_emp_destino´).Value := edtCodEmpDest.Text;
cdsCAQCopiaFT.Params.ParamByName(´cod_item_destino´).Value := edtCodItemDest.Text;
{ aqui no execute da o erro - DBExpress Error : Invalid Parameter }
cdsCAQCopiaFT.Execute;
{ Aqui recebo o parametro de retorno ! }
edtCodFT.Text := cdsCAQCopiaFT.Params.ParamByName(´new_cod_ft´).Value
showMessage(´Copia gerada com sucesso !´);
except
showMessage(´Problemas com a copia da Ficha Técnica. Por favor contacte a área de sistemas !´);
end;


GOSTEI 0
Rjun

Rjun

02/08/2005

Coloque em vez dos edits, valores que você sabe que dará algum retorno. Veja se funciona.

Tipo :

cdsCAQCopiaFT.Params.ParamByName(´cod_emp_origem´).Value := ´01´;



GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

Ja fiz isso ! Mesmo erro ! Tenho impressão que o Delphi não esta sabendo interpretar o retorno do parametro ! Falo isso porque no ambiente SQL do Oracle a STP funciona normalmente e retorna de forma correta o parametro !

Tenho a Opção de ao invés de criar um Stored Procedure Criar um Function no Oracle. Só que os componentes do DBExpress não exergam functions criadas no Oracle. Pelo menos eu não consequi fazer que eles enxerguem !


GOSTEI 0
Rjun

Rjun

02/08/2005

Sinto não poder te ajudar mais. Estava vendo no Delphi e o ADO tem provider para Oracle. Utilizo ADO com SQLServer e recomendo. Boa sorte e espero que consiga resolver seu problema.


GOSTEI 0
Mascotepc

Mascotepc

02/08/2005

De qualquer forma obrigado pela ajuda !


GOSTEI 0
POSTAR