Procedure que faça um UPDATE
06/02/2014
0
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
Posts
06/02/2014
Leandro Chiodini
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,
06/02/2014
Marcio Morando
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?
06/02/2014
Leandro 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
06/02/2014
Marcio Morando
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.
06/02/2014
Fabiano Carvalho
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)
06/02/2014
Leandro Chiodini
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,
06/02/2014
Marcio Morando
06/02/2014
Leandro Chiodini
SELECT @QUNREFOND = SUM(refugoOP.Quantidade) ,@QKGREFOND = SUM(refugoOP.Peso) ,@QUNREFCONV = SUM(refugoOP.Quantidade) ,@QKGREFCONV = SUM(refugoOP.Peso) FROM refugoOP where refugoOP.Maquina <> 'OND' ;
06/02/2014
Marcio Morando
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.
06/02/2014
Leandro Chiodini
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
06/02/2014
Marcio Morando
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.
06/02/2014
Leandro Chiodini
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,
Clique aqui para fazer login e interagir na Comunidade :)