sexta-feira, 1 de junho de 2012

Querys com SELECT e Utilização em Programas


COMANDOS:

SELECT - COMANDO DE RECUPERACAO

AS CLAUSULAS DEVEM SER ESPECIFICADAS NA ORDEM:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

  • SELECT BASICO:

    SELECT ALL/DISTINCT
           *
           NOME DA COLUNA
           EXPRESSAO ARITMETICA
           LITERAL
           FUNCAO ESCALAR
           FUNCAO DE GRUPO
    FROM   NOME DA TABELA

  • SELECIONAR TODAS AS COLUNAS: 

SELECT * FROM TAB1

SELECIONA O CONTEUDO DE TODOS OS CAMPOS DA TABELA TAB1.

  • SELECIONAR COLUNAS ESPECIFICAS

               SELECT AGENCIA, CONTA FROM TAB1

SELECIONA SOMENTE O CONTEUDO DOS CAMPOS AGENCIA E CONTA DA TABELA TAB1. NESTE FORMATO DEVEMOS COLOCAR UMA VIRGULA ENTRE O  NOME DAS COLUNAS. TODAS AS LINHAS APARECEM PARA A COLUNA ESPECIFICADA. A ORDEM DE SELECAO DAS COLUNAS DETERMINA A ORDEM DE RECUPERACAO.

  • ELIMINAR LINHAS DUPLICADAS NA SELECAO

               SELECT DISTINCT AGENCIA FROM TAB1

  • SELECT COM CLASSIFICACAO

   SELECT ...
   FROM   ...
   ORDER BY NOME DE COLUNAS/NUMERO DA ORDEM DE SELECAO DAS COLUNAS

         OBS: ... ORDER BY ... ASC
         ... ORDER BY ... DESC

SELECT DISTINCT DEPTO, CARGO
FROM   EMP
ORDER  BY       CARGO, DEPTO DESC
            OU
ORDER  BY       2,1 DESC

A TABELA RESULTANTE ESTA CLASSIFICADA EM ORDEM ASCENDENTE POR CARGO E DESCENDENTE POR DEPARTAMENTO.

  • SELECT COM CONDICAO DE PESQUISA

   SELECT ...
   FROM   ...
   WHERE NOME DE COLUNA
         EXPRESSAO =  EXPRESSAO
                   <>
                   >
                   <
                   >=
                   <=
         NOME DE COLUNA IS (NOT) NULL
         NOME DE COLUNA (NOT) LIKE VARIAVEL
         EXPRESSAO (NOT) IN (VARIAVEL,...)
         EXPRESSAO (NOT) BETWEEN EXPRESSAO AND EXPRESSAO
         AND
         OR

ATRAVES DA CLAUSULA WHERE PODE-SE COMPARAR O VALOR DE UMA COLUNA, VERIFICANDO EM QUAIS LINHAS A COLUNA SELECIONADA SATISFAZ A UM CONJUNTO DE RESTRICOES.

    SELECT MATRICULA, NOME, CARGO
    FROM   EMP
    WHERE  SALARIO >= 30000

    SELECT NOME, SALARIO
    FROM   EMP
    WHERE  CARGO = 'GERENTE'

    SELECT MATRICULA, NOME, CARGO, SALARIO
    FROM   EMP
    WHERE  SALARIO >= 30000 AND
           CARGO    = 'GERENTE'

    SELECT MATRICULA, NOME, CARGO, SALARIO
    FROM   EMP
    WHERE  SALARIO >= 30000 OR
           CARGO    = 'GERENTE'

  • SELECT COM OPERADOR IN

O OPERADOR IN PODE SER UTILIZADO PARA SUBSTITUIR VARIOS OR.

    SELECT MATRICULA, NOME, CARGO, SALARIO
    FROM   EMP
    WHERE  DEPTO = 'A00' OR
           DEPTO = 'B01' OR
           DEPTO = 'C01'

É O MESMO QUE:

    SELECT MATRICULA, NOME, CARGO, SALARIO
    FROM   EMP
    WHERE  DEPTO IN ('A00', 'B01', 'C01')


  • SELECT COM OPERADOR BETWEEN

O OPERADOR BETWEEN PODE SUBSTITUIR O AND QUANDO A CONSULTA DESEJAR RECUPERAR UM INTERVALO FECHADO DE VALORES.

    SELECT MATRICULA
    FROM   EMP
    WHERE  MATRICULA >= 9000 AND
           MATRICULA <= 10000

PODE SER SUBSTITUIDO POR:

    SELECT MATRICULA
    FROM   EMP
    WHERE  MATRICULA BETWEEN 9000 AND 10000

  • SELECT COM VALORES CALCULADOS

    SELECT MATRICULA, NOME, SALARIO+COMISSAO
    FROM   EMP
    WHERE  DEPTO = 'A00'

    SELECT MATRICULA, NOME, DEPTO
    FROM   EMP
    WHERE (SALARIO+COMISSAO)/12 >= 40000

  • SELECT COM FUNCOES DE GRUPO

    SELECT NOME DE COLUNA
           FUNCOES DE GRUPO
    FROM   ...
    GROUP  BY NOMES DE COLUNAS

FUNCOES DISPONIVEIS:

- SUM   (SOMA DE VALORES)
- AVG   (MEDIA DE VALORES)
- MAX   (MAIOR VALOR DE UMA COLUNA)
- MIN   (MENOR VALOR DE UMA COLUNA)
- COUNT (NUMERO DE OCORRENCIAS DE UMA COLUNA OU NUMERO DE LINHAS DE UMA TABELA)

-          SELECT COM TOTAL DE SALARIOS DO DEPARTAMENTO

      SELECT SUM(SALARIO)
      FROM   EMP
      WHERE  DEPTO = 'A00'

-          SELECT DA MEDIA DAS NOTAS DO ALUNO 0001

      SELECT AVG(NOTA)
      FROM   ALUNOS
      WHERE  MATRICULA = 0001

-          SELECT DA QUANTIDADE DE ALUNOS QUE TIRARAM 10 EM MATEMATICA

      SELECT COUNT(*)
      FROM   ALUNOS
      WHERE  NOTA = 10 AND
             MATERIA = 'MATEMATICA'

-          SELECT DA MENOR NOTA DE MATEMATICA DA ESCOLA:

      SELECT MIN(NOTA)
      FROM   ALUNOS
      WHERE  MATERIA = 'MATEMATICA'

-          SELECT DA MAIOR NOTA DE MATEMATICA DA ESCOLA:

      SELECT MAX(NOTA)
      FROM   ALUNOS
      WHERE  MATERIA = 'MATEMATICA'

-          SELECT DA MAIOR NOTA DE MATEMATICA DA ESCOLA:

      SELECT MAX(NOTA)
      FROM   ALUNOS
      WHERE  MATERIA = 'MATEMATICA'

  • SELECT COM CLAUSULAS GROUP E HAVING

A CLAUSULA GROUP SERVE PARA AGRUPAR O RESULTADO DE UMA QUERY E GERALMENTE EH USADA EM CONJUNTO COM AS FUNCOES DE GRUPO AVG, SUM, COUNT, MIN E MAX. NOS EXEMPLOS DADOS PARA ESTAS FUNCOES RECUPERAMOS SEMPRE APENAS UM VALOR. POR EXEMPLO, O MENOR SALARIO DE UM DEPARTAMENTO SERIA OBTIDO ASSIM:

SELECT MIN(SALARIO)
FROM   EMP
WHERE  DEPTO = 'AB0'


 

PROGRAMAS   DB2:

TODO O PROGRAMA DE DB2 TEMOS QUE INCLUIR UMA TABELA CHAMADA 'SQLCA' ESTA TABELA QUE CONTEM O 'SQLCODE'

           < EXEC SQL INCLUDE  'SQLCA'  END-EXEC >

SEMPRE QUE FOR UTILIZAR UM COMANDO 'SQL' DEVEMOS TESTAR SEU RETORNO ATRAVES DO 'SQLCODE'.

PARA TRABALHARMOS COM DADOS QUE DEVERAM SOFRER UM CERTO TIPO DE SELECAO DEVEMOS ENTAO MONTAR UM 'CURSOR'.

O CURSOR E DECLARADO NA WORKING APOS A DECLARACAO DAS TABELAS QUE SERAO USADAS NO PROGRAMA.

 EX:
  EXEC SQL  DECLARE  C1 CURSOR FOR
       SELECT 
       INTO   
       FROM   
       WHERE  
  END-EXEC

EM PROGRAMAS DE ATUALIZACAO DEVEMOS ANTES EXECUTAR UM 'RESTART' PARA VERIFICAR SE A TABELA FOI ATUALIZADA MAS NAO COMPLETAMENTE EM PROGRAMAS 'DB2' TEMOS QUE CRIAR UMA ROTINA DE ENCERRAMENTO E DENTRO DESTA ROTINA UM COMANDO CHAMADO 'ROLL BACK' PARA NAO EFETUAR AS PRIMEIRAS ATUALIZACOES CASO AS OUTRAS DEREM ERRO.

        EXEC  SQL
              ROLL BACK
        END-EXEC

QUANDO E MONTADO UM CURSOR O MESMO NAO DEVERA SER LIDO NORMALMENTE COMO OS OUTROS PROGRAMAS E SIM ATRAVES DE UM COMANDO CHAMADO 'FETCH'

             EXEC  SQL  FETCH C1
              INTO
        END-EXEC

I M P O R T A N T E : TODO CURSOR TEM QUE SER ABERTO E FECHADO DURANTE A EXECUCAO DO PGM.

CASO ELE TENHA CONSEGUIDO EXECUTAR TODOS OS COMANDOS DO PROGRAMA SEM NENHUM ERRO DEVEMOS UTILIZAR UM COMANDO PARA VALIDAR ESSAS ALTERACOES, CHAMA-SE 'COMMIT'

        EXEC  SQL
              COMMIT WORK
        END EXEC



PROCEDIMENTOS PARA PROGRAMA COM CURSORES DB2:

                                                                               
EM PROGRAMAS BATCH/ON-LINE:
                                                                               
Nos cancelamentos dos programas nao ha' necessidade de se executar o fechamento dos CURSORES DB2 que porventura estiverem abertos no  momento do cancelamento. O fechamento dos mesmos ficara' a cargo do sistema operacional. No caso de encerramento (processamento normal), fechar os CURSORES abertos, testando seu SQLCODE.                                           
                                                                               

EM API'S BATCH/ON-LINE:

Nos cancelamentos das api's, e' obrigatorio o fechamento dos CURSORES DB2 abertos  no  momento  do cancelamento.

O que ocorre nas api's, em caso de cancelamento, na verdade, e' um pseudocancelamento, pois a api ao encerrar anormalmente o  seu processo, nao e' cancelada mas finalizada, retornando ao programa chamador. Quem toma a decisao  de  cancelar  ou  nao o processamento e' o programa chamador. Caso a api seja chamada novamente pelo mesmo programa,  o CURSOR da api estara' aberto (pois a  api nao o fechou na chamada anterior).

Assim, o fechamento  em  casos  de cancelamento de api's e' necessario. Porem, apenas sera' executado o fechamento (EXEC SQL CLOSE CURSOR1 END-EXEC) sem o teste do sqlcode de fechamento (para que nao se tenha sobreposicao de dados do cancelamento).       

O fechamento com teste de sqlcode so' se dara' no caso  de  encerramento  normal da api, ou seja, apos o termino do processamento de todas as  linhas desejadas do CURSOR.                                                      
                                                                                                                                                               

Nenhum comentário:

Postar um comentário