Procedure que faça um UPDATE
Bom Dia Galera,
Quero criar um procedure para fazer um update em 4 campos de uma determinada tabela.
Mas não sei como fazer uma procedure que faz UPDATE.
Pensei em mais ou menos assim:
CREATE PROCEDURE NOMEPROC
AS
BEGIN
UPDATE TABELA
SET CAMPO = (SELECT CASE Tabela.Campo WHEN 'condicao' THEN SUM(Tabela.Campo) END)
SET CAMPO = (SELECT CASE Tabela.Campo WHEN 'condicao' THEN SUM(Tabela.Campo) END)
SET CAMPO = (SELECT CASE Tabela.Campo WHEN 'condicao' THEN SUM(Tabela.Campo) END)
SET CAMPO = (SELECT CASE Tabela.Campo WHEN 'condicao' THEN SUM(Tabela.Campo) END)
END
Como posso fazer?
Desde já OBRIGADO.
Quero criar um procedure para fazer um update em 4 campos de uma determinada tabela.
Mas não sei como fazer uma procedure que faz UPDATE.
Pensei em mais ou menos assim:
CREATE PROCEDURE NOMEPROC
AS
BEGIN
UPDATE TABELA
SET CAMPO = (SELECT CASE Tabela.Campo WHEN 'condicao' THEN SUM(Tabela.Campo) END)
SET CAMPO = (SELECT CASE Tabela.Campo WHEN 'condicao' THEN SUM(Tabela.Campo) END)
SET CAMPO = (SELECT CASE Tabela.Campo WHEN 'condicao' THEN SUM(Tabela.Campo) END)
SET CAMPO = (SELECT CASE Tabela.Campo WHEN 'condicao' THEN SUM(Tabela.Campo) END)
END
Como posso fazer?
Desde já OBRIGADO.
Marcio Morando
Curtidas 0
Respostas
Leandro Chiodini
06/02/2014
Bom dia
A principio é isso ai mesmo,
O update é um update normal,
nao pracisa de um set pra cada campo,
e nao precisa do end no final de cada select.
att,
A principio é isso ai mesmo,
O update é um update normal,
nao pracisa de um set pra cada campo,
e nao precisa do end no final de cada select.
att,
GOSTEI 0
Marcio Morando
06/02/2014
Tentei fazer desta Maneira,
CREATE PROCEDURE NOMEPROC
AS
BEGIN
DECLARE @QUNREFOND NUMERIC(18,0)
DECLARE @QKGREFOND NUMERIC(18,0)
DECLARE @QUNREFCONV NUMERIC(18,0)
DECLARE @QKGREFCONV NUMERIC(18,0)
SELECT @QUNREFOND = CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Quantidade) END,
@QKGREFOND = CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Peso) END,
@QUNREFCONV = CASE WHEN refugoOP.Maquina <> 'OND' THEN SUM(refugoOP.Quantidade) END,
@QKGREFCONV = CASE WHEN refugoOP.Maquina <> 'OND' THEN SUM(refugoOP.Peso) END
FROM refugoOP
GROUP BY refugoOP.Maquina
UPDATE INTERFTRIMERP..COSAPIENS.USU_TTB_OFS
SET USU_QUNREFOND = @QUNREFOND,
USU_QKGREFOND = @QKGREFOND,
USU_QUNREFCONV = @QUNREFCONV,
USU_QKGREFCONV = @QKGREFCONV
END
Mas não funcionou, o que pode estar errado?
CREATE PROCEDURE NOMEPROC
AS
BEGIN
DECLARE @QUNREFOND NUMERIC(18,0)
DECLARE @QKGREFOND NUMERIC(18,0)
DECLARE @QUNREFCONV NUMERIC(18,0)
DECLARE @QKGREFCONV NUMERIC(18,0)
SELECT @QUNREFOND = CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Quantidade) END,
@QKGREFOND = CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Peso) END,
@QUNREFCONV = CASE WHEN refugoOP.Maquina <> 'OND' THEN SUM(refugoOP.Quantidade) END,
@QKGREFCONV = CASE WHEN refugoOP.Maquina <> 'OND' THEN SUM(refugoOP.Peso) END
FROM refugoOP
GROUP BY refugoOP.Maquina
UPDATE INTERFTRIMERP..COSAPIENS.USU_TTB_OFS
SET USU_QUNREFOND = @QUNREFOND,
USU_QKGREFOND = @QKGREFOND,
USU_QUNREFCONV = @QUNREFCONV,
USU_QKGREFCONV = @QKGREFCONV
END
Mas não funcionou, o que pode estar errado?
GOSTEI 0
Leandro Chiodini
06/02/2014
Retorna algum erro,
SEria bacana tu mostrar a estrutura das tabelas que voce quer buscar os valores
e fazer os updates,
assim acho que fica mais facil de te ajudar...
tem algumas coisas nesta sua procedure que não consigo captar.
att
Chiodini
SEria bacana tu mostrar a estrutura das tabelas que voce quer buscar os valores
e fazer os updates,
assim acho que fica mais facil de te ajudar...
tem algumas coisas nesta sua procedure que não consigo captar.
att
Chiodini
GOSTEI 0
Marcio Morando
06/02/2014
Não aparece erro nenhum, somente não faz o UPDATE.
A estrutura da tabela que vou fazer o update são 4 campos INTEGER (4).
Na procedure quando fui declarar as variáveis deixei como INTEGER e ao roda-la deu erro de estouro aritmético.
Pesquisei o erro e deixei da forma que está agora. Não deu mais erro, mas não faz o UPDATE.
A estrutura da tabela que vou fazer o update são 4 campos INTEGER (4).
Na procedure quando fui declarar as variáveis deixei como INTEGER e ao roda-la deu erro de estouro aritmético.
Pesquisei o erro e deixei da forma que está agora. Não deu mais erro, mas não faz o UPDATE.
GOSTEI 0
Fabiano Carvalho
06/02/2014
Tentei fazer desta Maneira,
CREATE PROCEDURE NOMEPROC
AS
BEGIN
DECLARE @QUNREFOND NUMERIC(18,0)
DECLARE @QKGREFOND NUMERIC(18,0)
DECLARE @QUNREFCONV NUMERIC(18,0)
DECLARE @QKGREFCONV NUMERIC(18,0)
SELECT @QUNREFOND = CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Quantidade) END,
@QKGREFOND = CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Peso) END,
@QUNREFCONV = CASE WHEN refugoOP.Maquina <> 'OND' THEN SUM(refugoOP.Quantidade) END,
@QKGREFCONV = CASE WHEN refugoOP.Maquina <> 'OND' THEN SUM(refugoOP.Peso) END
FROM refugoOP
GROUP BY refugoOP.Maquina
UPDATE INTERFTRIMERP..COSAPIENS.USU_TTB_OFS
SET USU_QUNREFOND = @QUNREFOND,
USU_QKGREFOND = @QKGREFOND,
USU_QUNREFCONV = @QUNREFCONV,
USU_QKGREFCONV = @QKGREFCONV
END
Mas não funcionou, o que pode estar errado?
CREATE PROCEDURE NOMEPROC
AS
BEGIN
DECLARE @QUNREFOND NUMERIC(18,0)
DECLARE @QKGREFOND NUMERIC(18,0)
DECLARE @QUNREFCONV NUMERIC(18,0)
DECLARE @QKGREFCONV NUMERIC(18,0)
SELECT @QUNREFOND = CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Quantidade) END,
@QKGREFOND = CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Peso) END,
@QUNREFCONV = CASE WHEN refugoOP.Maquina <> 'OND' THEN SUM(refugoOP.Quantidade) END,
@QKGREFCONV = CASE WHEN refugoOP.Maquina <> 'OND' THEN SUM(refugoOP.Peso) END
FROM refugoOP
GROUP BY refugoOP.Maquina
UPDATE INTERFTRIMERP..COSAPIENS.USU_TTB_OFS
SET USU_QUNREFOND = @QUNREFOND,
USU_QKGREFOND = @QKGREFOND,
USU_QUNREFCONV = @QUNREFCONV,
USU_QKGREFCONV = @QKGREFCONV
END
Mas não funcionou, o que pode estar errado?
Não entendi esse group by..mas enfim
tente algo como
SET @VARIAVEL = (SELECT VALOR FROM TABELA)
GOSTEI 0
Leandro Chiodini
06/02/2014
Amigo tenta fazer algo assim
Do jeito que voce ta fazendo ai
eu nunca tinha visto.
a
tt,
CREATE PROCEDURE NOMEPROC AS BEGIN DECLARE @QUNREFOND NUMERIC(18,0) DECLARE @QKGREFOND NUMERIC(18,0) DECLARE @QUNREFCONV NUMERIC(18,0) DECLARE @QKGREFCONV NUMERIC(18,0) SET @QUNREFOND = select SUM(refugoOP.Quantidade) FROM refugoOP where refugoOP.Maquina <> 'OND' ; SET @QKGREFOND = select SUM(refugoOP.Peso) FROM refugoOP where refugoOP.Maquina <> 'OND' ; SET @QUNREFCONV = select SUM(refugoOP.Quantidade) FROM refugoOP where refugoOP.Maquina <> 'OND' ; SET @QKGREFCONV = select SUM(refugoOP.Peso) FROM refugoOP where refugoOP.Maquina <> 'OND' ; UPDATE INTERFTRIMERP..COSAPIENS.USU_TTB_OFS SET USU_QUNREFOND = @QUNREFOND, USU_QKGREFOND = @QKGREFOND, USU_QUNREFCONV = @QUNREFCONV, USU_QKGREFCONV = @QKGREFCONV END
Do jeito que voce ta fazendo ai
eu nunca tinha visto.
a
tt,
GOSTEI 0
Marcio Morando
06/02/2014
Desta Maneira que você me passou diz que a sintaxe está incorreta!
GOSTEI 0
Leandro Chiodini
06/02/2014
SELECT @QUNREFOND = SUM(refugoOP.Quantidade) ,@QKGREFOND = SUM(refugoOP.Peso) ,@QUNREFCONV = SUM(refugoOP.Quantidade) ,@QKGREFCONV = SUM(refugoOP.Peso) FROM refugoOP where refugoOP.Maquina <> 'OND' ;
GOSTEI 0
Marcio Morando
06/02/2014
SELECT @QUNREFOND = SUM(refugoOP.Quantidade) ,@QKGREFOND = SUM(refugoOP.Peso) ,@QUNREFCONV = SUM(refugoOP.Quantidade) ,@QKGREFCONV = SUM(refugoOP.Peso) FROM refugoOP where refugoOP.Maquina <> 'OND' ;
Dessa maneira que você esta me passando não me atende, pois preciso separar com o case para se for OND ele traga peso e quantidade e se nao for OND me traga o peso e quantidade.
O SELECT CORRETO SERIA ESSE:
SET @QUNREFOND = (select CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Quantidade) END from refugoOP GROUP BY refugoOP.OP,refugoOP.Maquina)
SET @QKGREFOND = (select CASE refugoOP.Maquina WHEN 'OND' THEN SUM(refugoOP.Peso) END from refugoOP GROUP BY refugoOP.OP,refugoOP.Maquina)
SET @QUNREFCONV = (select CASE WHEN refugoOP.Maquina <> 'OND' THEN SUM(refugoOP.Quantidade) END from refugoOP GROUP BY refugoOP.OP,refugoOP.Maquina)
SET @QKGREFCONV = (select CASE WHEN refugoOP.Maquina <> 'OND' THEN SUM(refugoOP.Peso) END from refugoOP GROUP BY refugoOP.OP,refugoOP.Maquina)
MAS AO DAR UPDATE DA O ERRO QUE DAVA QUANDO ESTAVA TENTANDO FAZER COM SUBSELECT QUE É O SEGUINTE:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
GOSTEI 0
Leandro Chiodini
06/02/2014
Sim porque esta retornando mais de um valor,
Subselects nao podem ocorrer isso.
Ate pode mais tem que usar dai em vez de =
usar o in
Desculpa eu realmente nao estou entendendo o que você busca.
O teu WHEN, nao faz diferença como esta sendo usado
pois se nao for 'OND' voce nao esta retornando mais nada.
Sugiro você a dar uma olhadinha na clausula CASE como funciona,
pode ser que ajude.
enfim, espero que alguem consiga te ajudar.
valew.
att
Subselects nao podem ocorrer isso.
Ate pode mais tem que usar dai em vez de =
usar o in
Desculpa eu realmente nao estou entendendo o que você busca.
O teu WHEN, nao faz diferença como esta sendo usado
pois se nao for 'OND' voce nao esta retornando mais nada.
Sugiro você a dar uma olhadinha na clausula CASE como funciona,
pode ser que ajude.
enfim, espero que alguem consiga te ajudar.
valew.
att
GOSTEI 0
Marcio Morando
06/02/2014
Sim porque esta retornando mais de um valor,
Subselects nao podem ocorrer isso.
Ate pode mais tem que usar dai em vez de =
usar o in
Desculpa eu realmente nao estou entendendo o que você busca.
O teu WHEN, nao faz diferença como esta sendo usado
pois se nao for 'OND' voce nao esta retornando mais nada.
Sugiro você a dar uma olhadinha na clausula CASE como funciona,
pode ser que ajude.
enfim, espero que alguem consiga te ajudar.
valew.
att
Subselects nao podem ocorrer isso.
Ate pode mais tem que usar dai em vez de =
usar o in
Desculpa eu realmente nao estou entendendo o que você busca.
O teu WHEN, nao faz diferença como esta sendo usado
pois se nao for 'OND' voce nao esta retornando mais nada.
Sugiro você a dar uma olhadinha na clausula CASE como funciona,
pode ser que ajude.
enfim, espero que alguem consiga te ajudar.
valew.
att
está diferente de OND "<>". Se não for OND vai me trazer o que não é OND que são os outros registros.
Mas mesmo assim muito Obrigado pela Ajuda.
GOSTEI 0
Leandro Chiodini
06/02/2014
Sim isso eu entendi,
Porem como voce esta fazendo ali,
voce separou o <> do igual
em selects destintos.
entao nao precisa do case.
Case é soh pra quando voce precisa uma escolha no mesmo select.
No caso ali nao precisaria.
Att,
Porem como voce esta fazendo ali,
voce separou o <> do igual
em selects destintos.
entao nao precisa do case.
Case é soh pra quando voce precisa uma escolha no mesmo select.
No caso ali nao precisaria.
Att,
GOSTEI 0