Stored Procedure retornando parametro para o Delphi
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 ?
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
Curtidas 0
Respostas
Rjun
02/08/2005
Posta o inicio da sua STP onde você declara os parâmetros.
GOSTEI 0
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
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
02/08/2005
´dbExpress : Invalid Parameter´;
A mensagem é só essa ou tem algo mais?
GOSTEI 0
Mascotepc
02/08/2005
dbExpress Error : Invalid Parameter - Somente isso !
GOSTEI 0
Rjun
02/08/2005
A variável [b:0b462b96f5]v_new_cod_ft[/b:0b462b96f5] tem algum valor?
GOSTEI 0
Mascotepc
02/08/2005
Não a variavel não possui nenhum valor !
GOSTEI 0
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 :
No DBExpress com Oracle não tem ParamByName?
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
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 !
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
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?
Bom, vc usa o parâmetro durante a STP ou ele só recebe um valor para retornar a aplicação?
GOSTEI 0
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.
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
02/08/2005
Vc ja executou a STP no Oracle pra ver se esta tudo OK?
GOSTEI 0
Mascotepc
02/08/2005
Sim executei no SQL*Plus e o retorno vem de maneira correta !
GOSTEI 0
Rjun
02/08/2005
Verifique se no TSQLStoredProc o parâmetro esta mercado como ptOutput.
GOSTEI 0
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
02/08/2005
Sim tanto no Servidor como Cliente está como ptOutput !
GOSTEI 0
Mascotepc
02/08/2005
Sim ! Tanto no Servidor como no Cliente o parametro esta como ptOutput !
GOSTEI 0
Rjun
02/08/2005
Você retirou a linha em que estava fazendo a atribuição pro parametro 5?
GOSTEI 0
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;
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
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
02/08/2005
Olhei os outros paramentros e eles estão como ptInput, será que é problema de DataType ?
GOSTEI 0
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
02/08/2005
Sim o erro ocore quando dou o Execute no ClientDataSet !
GOSTEI 0
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
02/08/2005
Recrei os parametros. Utilizei o ParamByName e deu o mesmo erro !
GOSTEI 0
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
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;
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
02/08/2005
Coloque em vez dos edits, valores que você sabe que dará algum retorno. Veja se funciona.
Tipo :
Tipo :
cdsCAQCopiaFT.Params.ParamByName(´cod_emp_origem´).Value := ´01´;
GOSTEI 0
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 !
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
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
02/08/2005
De qualquer forma obrigado pela ajuda !
GOSTEI 0