Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Mandioca

Substituição de comandos para redução do código PL/SQL

Recommended Posts

Boa tarde a todos!

 

Tenho uma dúvida em relação a um código PL/SQL no Oracle que precisei fazer para criar uma solução no meu sistema. O código está funcionando perfeitamente, e eu obtive o resultado que precisava. Porém, eu acredito que ele pode ser melhorado. Em síntese, ele realiza verificações em campos de uma tabela (não são todos os campos) para criar outra. Os campos sem valores não serão utilizados na tabela de destino. E por isso esta tabela de destino possuirá campos diferentes toda vez que o usuário executar esta função que estou criando. Eu postei abaixo um trecho do código em questão.

 

A variável VAUX é utilizada para criação da tabela. Como exemplo, no final da execução, ela será "CREATE TABLE TAB( CODIGOMOV NUMBER(6), HORAEXTRA NUMBER(12,2) )". A variável VSELECT é o que me auxilia, após a criação da tabela, na inserção dos dados que preciso. No final, ela será "INSERT INTO TAB VALUES SELECT CODIGOMOV, HORAEXTRA FROM MOVFOLHA". E a variável VTABSELECT, que é o resultado da minha função, é utilizada posteriormente para exibição dos dados na tela. Ela dá apelidos para os campos serem esteticamente melhores. Ela ficará "SELECT CODIGOMOV AS "Codigo", HORAEXTRA AS "Hora Extra" FROM TAB".

 

   SELECT COUNT(*) INTO VCOUNT FROM MOVFOLHA
  WHERE INICIO = VINICIO AND FIM = VFIM AND CODIGOEMPRESA = VEMPRESA AND HORAEXTRA IS NOT NULL;
  IF VCOUNT > 0 THEN
     VAUX := VAUX || ', HORAEXTRA NUMBER(12,2)';
     VSELECT := VSELECT || ', HORAEXTRA';
     VTABSELECT := VTABSELECT || ', HORAEXTRA AS "Hora Extra"';
  END IF;

  SELECT COUNT(*) INTO VCOUNT FROM MOVFOLHA
  WHERE INICIO = VINICIO AND FIM = VFIM AND CODIGOEMPRESA = VEMPRESA AND INSALUBRIDADE IS NOT NULL;
  IF VCOUNT > 0 THEN
     VAUX := VAUX || ', INSALUBRIDADE NUMBER(12,2)';
     VSELECT := VSELECT || ', INSALUBRIDADE';
     VTABSELECT := VTABSELECT || ', INSALUBRIDADE AS "Insalubridade"';
  END IF;

  SELECT COUNT(*) INTO VCOUNT FROM MOVFOLHA
  WHERE INICIO = VINICIO AND FIM = VFIM AND CODIGOEMPRESA = VEMPRESA AND COMISSOES IS NOT NULL;
  IF VCOUNT > 0 THEN
     VAUX := VAUX || ', COMISSOES NUMBER(12,2)';
     VSELECT := VSELECT || ', COMISSOES';
     VTABSELECT := VTABSELECT || ', COMISSOES AS "Comissoes"';
  END IF;

  SELECT COUNT(*) INTO VCOUNT FROM MOVFOLHA
  WHERE INICIO = VINICIO AND FIM = VFIM AND CODIGOEMPRESA = VEMPRESA AND GRATIFICACAO IS NOT NULL;
  IF VCOUNT > 0 THEN
     VAUX := VAUX || ', GRATIFICACAO NUMBER(12,2)';
     VSELECT := VSELECT || ', GRATIFICACAO';
     VTABSELECT := VTABSELECT || ', GRATIFICACAO AS "Gratificacao"';
  END IF;

 

Desde já agradeço a todos que me puderem ajudar!

Denilson Fernandes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1)

 

O código está funcionando perfeitamente, e eu obtive o resultado que precisava.

 

Você deve ter outras pendências para ver, se funciona deixa queito...

 

:)

 

2) a viewde metadados do Oracle que contém colunas de um usuário é a USER_TAB_COLUMNS com base nela o select poderia ser generico, não sei se é isto que você quet.

Dá uma olhada neste script, ele usa a tabela de metadados para gerar uma procedure

de auditoria, pode lhe ser útil.

 

--

Mas insistindo, funcionou bem, esquece...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu pensei que poderia reduzir o meu código (de fato, ele ficou extenso por conta dos "select count" e "ifs" repetitivos - aquilo era apenas um trecho).

Mas obrigado pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia,

 

Batendo o olho rapidamente... uma dica que me deram(ainda não provei a veracidade... rs)

Foi de evitar ao máximo a usa o COUNT(*)...

Não poderia trocar por um COUNT(PK)...

 

A explicação é que assim o banco usar a função count() sobre o índice da chave primaria da tabela.

Que no geral é um campo inteiro e assim ganha performance...

 

Ve assim ajuda um pouco... =)

 

Flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.