[firebase-br] SELECT INTO

//---- Kelsie.Z.Marshall ----// kelsie.z.marshall em gmail.com
Qua Set 2 14:30:04 -03 2009


Sandro

Valeu mesmo, eu não sabia desta opção "use all space", muito uitl pois eu 
sempre estava fazendo backup e para restaurar o tamanho.


Abraço

Kelsie
"Sandro Souza" <escovadordebits em gmail.com> 
wrote in message 
news:64d5939a0907230449r58637c37tf0d8d25814a70911 em mail.gmail.com...
Bom dia/tarde Weslley.

Grande Weslley, todo SGBD cria tabelas temporárias sempre que houver
necessidade.

Por exemplo, o seguinte código SELECT geraria uma tabela temporária com o
resultado calculado:

SELECT (CAMPO1 + CAMPO2) AS SOMA, CAMPO3, CAST(CAMPO4 AS INTEGER)AS VALOR,
......

Dessa forma, o SGBD executa o SELECT, e vai armazenando, temporariamente, os
resultados obtidos.

No exemplo que você postou, um código SELECT é executado, e portanto, seu
resultado é armazenado em uma tabela temporária, automaticamente, pelo
próprio SGBD.

Usando esse SELECT em um FOR com a cláusula INTO, já instrui o SGBD a
percorrer essa tabela temporária, com os resultados gerados, e copiar os
respectivos resultados para as variáveis informadas na cláusula INTO.

Assim que essas tabelas temporárias não são mais necessárias, elas são
automaticamente descartadas pelo SGBD.

Nesse caso do FOR/SELECT/INTO, assim que terminar o laço, a tabela
temporária que armazenava os resultados do seu SELECT será automaticamente
descartada.

De que forma cada SGBD armazena essas tabelas temporárias, é questão
particular de cada um, segundo sua arquitetura interna.

Nos SGBDs cuja arquitetura é projetada para armazenar todos objetos de banco
(tabelas, visões, índices, etc...) dentro de um único arquivo (podendo até
utilizar mais de um), como é o caso do Firebird, do M$$$$$$$$ SQL Server, do
$$$$$$$$$$$$$Oracle$$$$$$$$$, e outros, o arquivo que contém esses objetos
tem seu tamanho automaticamente aumentado caso haja necessidade, como
acontece nas situações em que essas tabelas temporárias tem que ser criadas
e os respectivos resultados devem ser armazenados.

Se houver espaço interno suficiente nesses arquivos, então não será
necessário aumentar seus tamanhos, mas caso não haja espaço livre, ele será
aumentado com certeza.

Você pode imaginar cada arquivo desse como se fosse realmente um mini-HD,
com direito a um sistema de armazenamento de arquivos, como se fosse uma
FAT, NTFS, EXT, REISERFS, ou seja lá como for (SGBDFS :D ), e cada SGBD
implementa de sua maneira.

Normalmente, esses arquivos não tem seus tamanhos reduzidos automaticamente
pelo SGBD, ou seja, o "bichano" só cresce, mas normalmente não diminui. Na
grande maioria desses SGBDs, a única forma de reduzir seu tamanho ao que
realmente está sendo utilizado, é gerando um backup e restaurando-o em
seguida, e no caso do Firebird, com a opção "use all space", que realmente
deixa a base de dados apenas com o tamanho que realmente está ocupando, e
que será aumentado naturalmente a medida que essa base seja utilizada e
novas tabelas temporárias sejam necessárias.

Experimente criar uma nova tabela, e inserir vários registros de forma que a
base aumente em cerca de uns 10Mb. Depois delete essa tabela (DROP TABLE
.....). Veja que o tamanho da base de dados não reduziu após o DROP TABLE.
Apenas gerando um backup dessa base e restaurando-a em seguida com a citada
opção.

Espero ter ajudado mais que atrapalhado. :D

2009/7/22 Weslley Mendonça 
<weslleymendonca em gmail.com>

> Galera,
>
> Sou novo no universo da programação, e gostaria de tirar algumas dúvidas
> sobre o SELECT INTO.
>
> Vamos lá:
>
> Eu nas minhas pesquisas li que ele pega o resultado do select e contrói 
> uma
> tabala apartir dele...
>
> essa explicação ficou meio confusa para mim, gostaria de saber se alguém
> pode me dar uma explicação melhor
>
> segue um trecho de código para ajudar...
>
>
> BEGIN
>  ICONT_PROGUI = 0;
>
>  FOR
>    SELECT itm.cod_pro, itm.cod_den, fac.desc_face, odo.cod_cli,
> odo.cod_dep,
>           odo.data_odon, lot.cod_med, pro.carencia, pro.qtde,
> cli.data_nasc,
>           itm.seq, cli.situacao, odo.cod_inter, med.interior
>    FROM itm_odon itm INNER JOIN odontograma odo  ON (    odo.num_lote  =
> itm.num_lote
>                                                      AND odo.num_odon  =
> itm.num_odon)
>                      INNER JOIN lote_odon   lot  ON (lot.num_lote  =
> odo.num_lote)
>                      INNER JOIN cliente     cli  ON (    cli.cod_cli   =
> odo.cod_cli
>                                                      AND cli.cod_dep   =
> odo.cod_dep)
>                      INNER JOIN medico med       ON (lot.cod_med   =
> med.cod_med)
>                      INNER JOIN procedimento pro ON (pro.cod_pro   =
> itm.cod_pro)
>                      INNER JOIN face fac         ON (fac.desc_face =
> itm.cod_face)
>    WHERE itm.num_lote = :pNum_Lote
>    AND   itm.num_odon = :pNum_Odon
>    AND   itm.situacao = 'A'
>    ORDER BY itm.cod_pro
>    INTO :iCod_Pro, :iCod_Den, :vDesc_Face, :iCod_Cli, :iCod_Dep,
> :dData_Odon,
>         :iCod_Med, :iCarencia, :iQtde, :dData_Nasc, :iSeq, :vSit,
> :iCod_Inter,
>         :vInte
>
>
>
> Isso eh um pedaço de procedure.
>
>
> Valeu.
> --
> Weslley Mendonça
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: 
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa






Mais detalhes sobre a lista de discussão lista