sábado, 2 de julho de 2016

SQL - Select dinâmico (Where)

Olá!

Neste post será apresentado como realizar uma pesquisa na base de dados (DB) de forma dinâmica. Onde, o resultado da consulta do Select depende dos valores variáveis que serão utilizados na comparação do Where.

Valor variável?
Os dados que serão utilizados como condição para realizar a pesquisa no DB podem ser fixos ou dinâmicos no código SQL. O valor dinâmico é gerado de acordo com a regra de negócio, exemplo: valor deve ser da entrada do programa; valor é gerado por meio de comparações; valor é gerado a partir da data corrente do sistema; etc.

  • E este valor dinâmico será armazenado em uma variável host (variável usada em código SQL).

No post anterior demonstrei o Select com o Where fixo, mas se na tabela haver vários registros, será necessário criar um SQL para cada registro. E isso não é nada prático.

Veja como adicionar uma variável COBOL em um código SQL, para consultar as informações no DB.

O modelo de tabela do banco de dados (DB) usado para esse post:

PESSOA
CD_PESSOANOMESOBRENOMEIDADE
1FelipeBarbosa23
2AnaVieira20
3JoãoSantos19
4AlineSilva21
5MairaDantas25

Na tabela acima denominada de PESSOA, com 4 campos: CD_PESSOA, NOME, SOBRENOME e IDADE. Contendo 5 registros. De modo que a chave (key - FK) desta tabela é o campo CD_PESSOA.

Assim, para consultar as informações de Felipe, o SQL deve ser:
    SELECT NOME
         , SOBRENOME
         , IDADE
      FROM PESSOA
     WHERE CD_PESSOA = 1

E para consultar as informações de Ana:
    SELECT NOME
         , SOBRENOME
         , IDADE
      FROM PESSOA
     WHERE CD_PESSOA = 2

E para consultar as informações de Maira:
    SELECT NOME
         , SOBRENOME
         , IDADE
      FROM PESSOA
     WHERE CD_PESSOA = 5
  • Repare que a única diferença para consultar as informações das pessoas é o valor de comparação no Where do SQL.

Então, para não repetir código e reutilizar o mesmo SQL para pesquisar as informações de qualquer pessoa, primeiramente temos que definir a variável que irá receber o valor de comparação, neste caso o valor de código de pessoa.

Se não especificado o tamanho da variável, consulte a estrutura de definição da tabela. A estrutura da tabela deste exemplo, é:

CREATE TABLE PESSOA 
    (
      CD_PESSOA INTEGER
    , NOME      VARCHAR (50)
    , SOBRENOME VARCHAR (50)
    , IDADE     SMALLINT
    );

Assim, a variável host que será definida na LOCAL-STORAGE do programa terá o formato:

77 GDA-CD-PESSOA            PIC S9(009) COMP VALUE ZEROS.

E será utilizada no código da rotina da seguinte forma:
    SELECT NOME
         , SOBRENOME
         , IDADE
      FROM PESSOA
     WHERE CD_PESSOA = :GDA-CD-PESSOA

Desta forma antes de executar a pesquisa, é somente realizar a movimentação do código da pessoa que queira consultar para a variável GDA-CD-PESSOA.

Note que antes da variável host há ":". Este dois pontos indica que no código SQL está sendo usado uma variável do COBOL.

Abaixo, o código de exemplo com um Select para consultar o nome da pessoa com Where dinâmico, onde o campo da tabela CD_PESSOA é comparado com o valor da variável GDA-CD-PESSOA:

SQL - Select Dinâmico Felipe

SQL - Select Dinâmico Felipe
SQL - Select Dinâmico Felipe
SQL - Select Dinâmico Felipe
SQL - Select Dinâmico Felipe




















































Podemos observar que antes de executar a consulta do DB é movimentado o valor do código da pessoa a ser pesquisada. O resultado da execução desse código:

Nome cadastrado para código pessoa 1 : Felipe
Nome cadastrado para código pessoa 2 : Ana
Nome cadastrado para código pessoa 5 : Maira

É uma boa prática limpar as variáveis que irão receber dados, conforme o INITIALIZE executado antes da pesquisa do nome no DB.

Atenção:
Variáveis host numéricas devem ser compactadas.

Enfim, conforme ao inicio do post o valor movimentado para a variável host na condição do SQL pode ser atribuído da entrada da rotina, ou qualquer outra regra negocial.

Para Ctrl + C do código acesse aqui.
Consultar a relação de Termos e Abreviaturas acesse aqui.


Até o próximo post!

Nenhum comentário:

Postar um comentário