clausula Returning Firebird
B. dia a todos
tenho um sql de insert em um IbQuery e apos executa-la gostaria de pegar o valor retornado, visto que o firebird tem essa facilidade, rem relação ao campo autoincremento.
Sql = insert into customer (customer) values ('Carlos') returning cust_no;
Apos o IbQuery.ExeSql; gostaria de pegar o valor do campo cust_no
Tentei IbQuery.FieldByName('cust_no').asinteger mas nao deu.
Quem puder me auxiliar agradeço.
Att.
Alexandre
Ale.sjrp
Curtidas 0
Respostas
Ricardo Araujo
29/12/2010
caro colega
estava vendo a documentação do firebird encontrei isto da uma olhada.
CREATE PROCEDURE SEARCH_ACTOR(NAME VARCHAR(50))RETURNS (TITLE VARCHAR(50),ACTOR VARCHAR(50),PRICE NUMERIC(18,2))ASDeclare variable i integer;Declare variable SQL varchar(1000);BEGINi=10;Sql = 'select first '|| :i ||' TITLE,ACTOR,PRICE from productwhere actor containing '''||name||''''FORexecute statement :sqlINTO :TITLE,:ACTOR,:PRICEDOBEGINif (price>30) then price=30;SUSPEND;ENDEND
só não sei se ai ajuda.rbbarretorbbarreto@hotmail.com
estava vendo a documentação do firebird encontrei isto da uma olhada.
CREATE PROCEDURE SEARCH_ACTOR(NAME VARCHAR(50))RETURNS (TITLE VARCHAR(50),ACTOR VARCHAR(50),PRICE NUMERIC(18,2))ASDeclare variable i integer;Declare variable SQL varchar(1000);BEGINi=10;Sql = 'select first '|| :i ||' TITLE,ACTOR,PRICE from productwhere actor containing '''||name||''''FORexecute statement :sqlINTO :TITLE,:ACTOR,:PRICEDOBEGINif (price>30) then price=30;SUSPEND;ENDEND
só não sei se ai ajuda.rbbarretorbbarreto@hotmail.com
GOSTEI 0
Ale.sjrp
29/12/2010
nao ajuda, realmente preciso pegar o resultado na IbQuery
GOSTEI 0
João Sobrinho
29/12/2010
Colega, tente assim:
IbQuery.Open;
GOSTEI 0
Ricardo Araujo
29/12/2010
estão faz assim, vai fica um pouco grande o sql mas vale apena.
Exemplo :
var
lcRetorno : string;
begin
IbQuery.close;
IBQuery1.sql.Clear;
IbQuery.sql.Add('INSERT INTO CLIENTE ');
IbQuery.sql.Add('(NOME, ENDERECO, BAIRRO, CIDADE)');
IbQuery.sql.Add('VALUES');
IbQuery.sql.Add('(:NOME, :ENDERECO, :BAIRRO, :CIDADE)');
IbQuery.ParabyName('NOME').AsString := FNome;
IbQuery.ParabyName('ENDERECO').AsString := FEndereco;
IbQuery.ParabyName('BAIRRO').AsString := FBairro;
IbQuery.ParabyName('CIDADE').AsString := FCidade;
IBQuery1.ExecSQL;
// agora vou monta o sql para pegar o último código.
// você também pode montar um metodo que retorna os codigo de todas a tabelas.
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select max(cd_cod) from CD_CLIENTE');
IBQuery1.Open;
lcRetorno := IntToStr( IBQuery1.FieldByName('MAX').AsInteger);
espero ter ajudado
rbbarreto
rbbarreto@hotmail.com
Exemplo :
var
lcRetorno : string;
begin
IbQuery.close;
IBQuery1.sql.Clear;
IbQuery.sql.Add('INSERT INTO CLIENTE ');
IbQuery.sql.Add('(NOME, ENDERECO, BAIRRO, CIDADE)');
IbQuery.sql.Add('VALUES');
IbQuery.sql.Add('(:NOME, :ENDERECO, :BAIRRO, :CIDADE)');
IbQuery.ParabyName('NOME').AsString := FNome;
IbQuery.ParabyName('ENDERECO').AsString := FEndereco;
IbQuery.ParabyName('BAIRRO').AsString := FBairro;
IbQuery.ParabyName('CIDADE').AsString := FCidade;
IBQuery1.ExecSQL;
// agora vou monta o sql para pegar o último código.
// você também pode montar um metodo que retorna os codigo de todas a tabelas.
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select max(cd_cod) from CD_CLIENTE');
IBQuery1.Open;
lcRetorno := IntToStr( IBQuery1.FieldByName('MAX').AsInteger);
espero ter ajudado
rbbarreto
rbbarreto@hotmail.com
GOSTEI 0
Ale.sjrp
29/12/2010
com a condição max ja utilizo, queria algo mais especifico, visto que o banco de dados firebird disponibiliza essa funcao no proprio bd para retornar o valor do post em um campo autoincremento.
Nessa cláusula Max(campo) devemos tomar um cuidado em relação a sistemas que operam em rede visto que pode ocorrer insert em um curto espaço de tempo (entre duas maquinas efetuando no mesmo cadastro).
GOSTEI 0
Julio Develis
29/12/2010
O IBQuery não fornece suporte para essa funcionalidade. Use o Zeos que funciona;
GOSTEI 0
Filipe Sousa
29/12/2010
Segundo as regras definidas do firebird para instruções de insert, a cláusula "returning" não está disponível em ESQL (Embedded SQL, ou melhor instruções SQL escritas através de uma linguagem de programação), que é o seu caso.
Como solução, você terá que criar uma PSQL, ou uma procedure com um parâmetro de saída.
GOSTEI 0