Mandioca 0 Denunciar post Postado Junho 29, 2011 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
Motta 645 Denunciar post Postado Junho 29, 2011 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
Mandioca 0 Denunciar post Postado Junho 29, 2011 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
supernoi 0 Denunciar post Postado Junho 30, 2011 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