Informix: Como obter um ID do último registro inserido
Pergunta
Qual é a maneira mais eficiente de obter o valor da coluna serial após a declaração de inserção? Ou seja, estou procurando uma maneira de replicar @@IDENTITY
ou SCOPE_IDENTITY
Funcionalidade do MS SQL
Solução
O valor da última inserção serial é armazenado no registro SQLCA, como a segunda entrada na matriz SQLERRD. A resposta de Brian está correta para o ESQL/C, mas você não mencionou qual idioma está usando.
Se você está escrevendo um procedimento armazenado, o valor pode ser encontrado assim:
LET new_id = DBINFO('sqlca.sqlerrd1');
Também pode ser encontrado em $sth->{ix_sqlerrd}[1]
Se estiver usando o DBI
Existem variantes para outros idiomas/interfaces, mas tenho certeza de que você terá a ideia.
Outras dicas
Eu vi isso usado.
if LOCAL_SQLCA^.sqlcode = 0 then
/ return serial */
Result := LOCAL_SQLCA^.sqlerrd[1]
else
/* return error code */
Result := -(Abs(LOCAL_SQLCA^.sqlcode));
Eu não acho que "eficiente" é a palavra que você está procurando aqui. É mais uma questão de precisão. Não tenho certeza se posso fazer um trabalho melhor ao explicar isso do que os livros SQL on -line, mas geralmente, a menos que você realmente saiba o que está fazendo e tenha um motivo específico para usar @@ identidade, use Scope_Identity. A razão mais óbvia para isso é que @@ a identidade não retornará a identidade do registro mais recente adicionado pelo seu programa/SP/etc se houver um gatilho anexado à tabela. Além disso, pode haver problemas em aplicações de alto volume em que duas transações ocorrem ao mesmo tempo e o seguinte ocorreria ...
- Sua inserção
- Inserção de outro usuário
- Devolver a identidade de outro usuário para você
O OP não especificou qual versão do Informix está sendo usada, então pode haver respostas diferentes