[firebase-br] SELECT INTO

Weslley Mendonça weslleymendonca em gmail.com
Sex Jul 24 11:32:53 -03 2009


Sandro,

valeu pela explicação...

tu é o cara!



2009/7/23 Sandro Souza <escovadordebits em 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
>>
>
>


-- 
Weslley Mendonça
LPI000161289



Mais detalhes sobre a lista de discussão lista