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

Foi útil?

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

  1. Sua inserção
  2. Inserção de outro usuário
  3. 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top