Ir para conteúdo
  • Cadastre-se

dev botao

Reestruturar updates do formato OldSetClauseSemantics = 1 para sql padrao.


Ver Solução Respondido por [email protected],
  • Este tópico foi criado há 1309 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Olá a todos!
   Eu utilizo o firebird 2.5 com a opção OldSetClauseSemantics = 1. Ex:

  update lixo_teste set vlr_01 = (select max(prc_venda) from produto_empresa pe where cd_loja=2 and lixo_teste.cd_prod = pe.cd_prod), vlr_02 = vlr_01 - 1, vlr_03 = vlr_02 - 1 where exists (select * from produto_empresa pe where cd_loja=2 and lixo_teste.cd_prod = pe.cd_prod);

   Utilizo muito a recuperação do valor da coluna 1 em outras colunas. Como as novas versões do firebird não tem essa opção, terei que reescrever todos os meus updates? Como ficaria? um exemplo pv. Tenho que ficar repedindo o select max... nas outras colunas pra obter o valore necessário? Tenho subselects grandes, seria uma grande mudança. Preciso de sugestões e/ou esclarecimentos.

Obg.

  • Consultores
Postado
Em 23/04/2021 at 09:43, Rodrigo Cunha disse:

Olá a todos!
   Eu utilizo o firebird 2.5 com a opção OldSetClauseSemantics = 1.

   Utilizo muito a recuperação do valor da coluna 1 em outras colunas. Como as novas versões do firebird não tem essa opção, terei que reescrever todos os meus updates? Como ficaria? um exemplo pv. Tenho que ficar repedindo o select max... nas outras colunas pra obter o valore necessário? Tenho subselects grandes, seria uma grande mudança. Preciso de sugestões e/ou esclarecimentos.

Obg.

Olá Rodrigo.

   Esse problema se resolve reavaliando o método que se faz o SQL. Por exemplo, se você precisa pegar um valor para utilizar várias vezes, você pode usar o "ExecuteBlock" que permite executar um SQL como se fosse dentro de uma procedure. Daí joga o valor numa variável e reutiliza quantas vezes precisar.

   Usando o Execute Block você poderá usar também outros recursos como "For Select"...

Em 23/04/2021 at 09:43, Rodrigo Cunha disse:

update lixo_teste set vlr_01 = (select max(prc_venda) from produto_empresa pe where cd_loja=2 and lixo_teste.cd_prod = pe.cd_prod), vlr_02 = vlr_01 - 1, vlr_03 = vlr_02 - 1 where exists (select * from produto_empresa pe where cd_loja=2 and lixo_teste.cd_prod = pe.cd_prod);

   Eu particularmente não entendi esse código seu. O que vem a ser a tabela lixo_teste? É uma tabela temporária? Porque o Where exists é feito dessa maneira?

   Sem entender a estrutura do seu BD fica difícil de ajudar. Por favor, nos dê a modelagem das tabelas usadas, mesmo que sejam apenas os campos usados no SQL em questão.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Membros Pro
Postado

Obg pelo retorno. Vamos lá.

Criei uma tabela temporaria com o nome: Create Table  lixo_teste (cd_prod integer, vlr_01 numeric(9,2), vlr_02 numeric(9,2), vlr_03 numeric(9,2)).

Ai eu uso o update pra pegar o valor maximo de uma coluna de outra tabela e colocar no vlr_01, depois eu pego o campo vlr_01 diminuo 1 e atribuo ao campo vlr_02 e a mesma coiasa com o campo vlr_03. Então ficaria assim

cd_prod  vlr_01   vlr_02    vlr_03

000001   10,00       9,00       8,00

000002  15,00       14,00      13,00

Como o vlr_01 é de um select max... eu uso o resultado dentro da mesma update para compor os campos vlr_02 e vlr_03. 

No firebird 2.5 eu utilizada o OldSetClauseSemantics = 1 , mas no firebird 3 não há essa possibilidade. Eu queria entender se no update eu não consigo mesmo utilizar o resultado de uma campo para ser utilizado em outro, no caso, no mesmo comando: update lixo_teste vlr_01 = 10, vlr_02 = vlr_01 -1, vlr_03 = vlr_02 - 1. Neste exemplo não fica 10 - 9 - 8 o resultado e sim 10 -1  -1. Se eu quiser aproveitar a informação eu devo colocar no execute block o update lixo_teste set vlr_01=10. depois update lixo_teste vlr_02 = vlr_01  - 1....
Ou tem alguma outra forma de eu aproveitar minha lógica?

  • Consultores
Postado
2 minutos atrás, Rodrigo Cunha disse:

No firebird 2.5 eu utilizada o OldSetClauseSemantics = 1 , mas no firebird 3 não há essa possibilidade. Eu queria entender se no update eu não consigo mesmo utilizar o resultado de uma campo para ser utilizado em outro,

Apenas pra explicar essa parte, você não consegue porque isso é fora do "padrão SQL". O Firebird permitia isso, mas como estava fora do padrão, eles removeram. Ou seja, essa alteração foi feita pro Firebird ficar mais compatível com os padrões SQL.

10 minutos atrás, Rodrigo Cunha disse:

Criei uma tabela temporaria com o nome: Create Table  lixo_teste (cd_prod integer, vlr_01 numeric(9,2), vlr_02 numeric(9,2), vlr_03 numeric(9,2)).

Ai eu uso o update pra pegar o valor maximo de uma coluna de outra tabela e colocar no vlr_01, depois eu pego o campo vlr_01 diminuo 1 e atribuo ao campo vlr_02 e a mesma coiasa com o campo vlr_03. Então ficaria assim

cd_prod  vlr_01   vlr_02    vlr_03

000001   10,00       9,00       8,00

000002  15,00       14,00      13,00

Como o vlr_01 é de um select max... eu uso o resultado dentro da mesma update para compor os campos vlr_02 e vlr_03. 

Você não vai conseguir fazer isso no mesmo update a não ser que repita o "select max" várias vezes.

Acho que ainda não entendi o que você está tentando fazer... Quero dizer, por que você precisa dessa tabela temporária? Qual é a ideia/funcionalidade?

17 minutos atrás, Rodrigo Cunha disse:

Se eu quiser aproveitar a informação eu devo colocar no execute block o update lixo_teste set vlr_01=10. depois update lixo_teste vlr_02 = vlr_01  - 1....

Isso de executar dois updates, você poderia fazer isso até por fora de um execute block. Bastando executar um update após o outro.

 

Já o Execute block permite você fazer algo como:

EXECUTE BLOCK
AS
declare MPV Numeric(9,2);
declare CDP INT;
BEGIN
  FOR SELECT max(prc_venda), cd_prod
      from produto_empresa pe
      INTO MPV, CDP
  DO
  BEGIN
    update lixo_teste
    set vlr_01 = :MPV, vlr_02 = :MPV - 1, vlr_03 = :MPV - 2
    where cd_prod = :CDP
  END
END

 

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Membros Pro
  • Solution
Postado

Boa noite! A minha questão era se realmente não havia uma forma de preservar meus updates, pois estão todos naquele formato. Terei que alterar todos em meu sistema para adequar no padrão sql. Infelizmente terei muita dificuldade de ir para o Firebird 3. Obg pelas informações.

  • Moderadores
Postado
10 horas atrás, Rodrigo Cunha disse:

Boa noite! A minha questão era se realmente não havia uma forma de preservar meus updates, pois estão todos naquele formato. Terei que alterar todos em meu sistema para adequar no padrão sql. Infelizmente terei muita dificuldade de ir para o Firebird 3. Obg pelas informações.

Mas digo que vai ganhar muito em velocidade e já vai ficar pronta para a versão 4.0

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

  • Este tópico foi criado há 1309 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.