Array
(
)

Procedure que faça um UPDATE

Marcio Morando
   - 06 fev 2014

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.

Chiodini
   - 06 fev 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,

Marcio Morando
   - 06 fev 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?

Chiodini
   - 06 fev 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

Marcio Morando
   - 06 fev 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.

Faabiianooc
   - 06 fev 2014


Citação:
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?


Não entendi esse group by..mas enfim
tente algo como

SET @VARIAVEL = (SELECT VALOR FROM TABELA)

Chiodini
   - 06 fev 2014

Amigo tenta fazer algo assim

#Código

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,

Marcio Morando
   - 06 fev 2014

Desta Maneira que você me passou diz que a sintaxe está incorreta!

Chiodini
   - 06 fev 2014

#Código



SELECT @QUNREFOND = SUM(refugoOP.Quantidade) 
	   ,@QKGREFOND =  SUM(refugoOP.Peso) 
	   ,@QUNREFCONV =  SUM(refugoOP.Quantidade) 
	   ,@QKGREFCONV =  SUM(refugoOP.Peso)
	   FROM refugoOP where refugoOP.Maquina <> 'OND' ;

Marcio Morando
   - 06 fev 2014


Citação:
#Código



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.

Chiodini
   - 06 fev 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

Marcio Morando
   - 06 fev 2014


Citação:
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


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.

Chiodini
   - 06 fev 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,