Página 1 de 1

Ideias para uma query

Enviado: Qui, 05 Set 2013 3:36 pm
por Rafael_Santos
Olá a todos,

estou criando uma procedure que irá carregar uma tabela.

Tenho uma query de +- 30 linhas que preciso extrair apenas a quantidade obtida, campo identificador e data relacioanda.

Logo pensei que poderia criar uma temp table na procedure e popular através da query mencionada a cima, mas não é possivel criar uma temp table na procedure, estou correto?

Li que o melhor a se fazer seria criar um cursor, mas cursor gasta muito tempo e memória.

Criar uma query monstra com sub querys também deixaria devagar.

Alguém pode me dar alguma ideia de como proceder com este problema?

Agradeço a atenção de todos, abraços!

Re: Ideias para uma query

Enviado: Qui, 05 Set 2013 5:12 pm
por DanielNN
"query de 30 linhas" dependendo do relacionamento feito, é NADA.
Se você nota, via tempo e plano de execução da querie , que ela está satisfatória, não vejo problemas em utilizar cursor.
A não ser que sua querie não tenha os realacionamentos corretos ou suas tabelas estejam desnormalizadas e/ou sem índices adequados.

Seria interessante você mostrar ao menos esqueleto do que pretende fazer.

Re: Ideias para uma query

Enviado: Seg, 09 Set 2013 11:48 am
por Rafael_Santos
Olá Noctifero,
muito obrigado por ter respondido e por ter concedido sua atenção.

Já tinha lido seu post no dia que você tinha postado, mas estava com duvida na minha própria resposta.

Encontrei uma alternativa para o problema e gostaria de agradecer a atenção concedida.

Re: Ideias para uma query

Enviado: Qui, 12 Set 2013 12:51 am
por stcoutinho
Rafael,

Se você pensava em criar uma "temp table", dê uma olhada no assunto GLOBAL TEMPORARY TABLE.

Abraços,

Sergio Coutinho

Re: Ideias para uma query

Enviado: Qui, 26 Set 2013 10:35 am
por gpereira
Bom Dia !

Dependendo da massa de dados, creio que não tenha grande impacto a criação de um cursor com essa query.

Caso se sinta mais confortável trabalhando com tabelas temporárias, é possível sim a criação via procedure.

Não tenho sua query, porem segue exemplo abaixo:

Selecionar tudo

CREATE OR REPLACE PROCEDURE [NOME_PROCEDURE] IS

BEGIN

EXECUTE IMMEDIATE 
'CREATE GLOBAL TEMPORARY TABLE [TMP_TABLE_NAME]
on commit preserve rows
AS
[QUERY_CITADA]' ;

END ;
Obs: Não tenho certeza e não testei se esta criação funciona com este "AS [QUERY]", creio que sim, porem caso não funcione crie campo a campo depois inserira na tabela.


Mais informações sobre tabelas temporarias:

http://www.devmedia.com.br/tabelas-temp ... racle/1915

{}'s

Re: Ideias para uma query

Enviado: Qui, 26 Set 2013 3:02 pm
por stcoutinho
Oi,

Só contribuindo com as explicações de gpereira, uma temporary table não precisa necessariamente ser criada dinamicamente.

Se por exemplo sua tabela temporária será usada continuamente, basta você criar ela à parte (o comando "create global temporary table" que o gpereira mostrou). Depois pode mencionar ela em qualquer código PL/SQL (procedures, packages, etc).

Entenda que para uma TEMPORARY TABLE, SOMENTE OS DADOS são TEMPORARIOS. A definição/estrutura da tabela continua "tão permanente" como qualquer outra tabela normal. Neste caso, somente um comando de DROP TABLE conseguiria remover uma tabela GLOBAL TEMPORARY.

Uma tabela temporária do ORACLE tem a sua definição armazenada no dicionário de dados do banco, mas só consegue armazenar dados durante a sessão corrente do banco de dados que efetuou alguma transação de INSERT/UPDATE. Os dados armazenados temporariamente nesta tabela só são visíveis para a sessão de banco que a populou.

Ou sejam, eu poderia ter 100 sessões - por exemplo - fazendo diversas operações de INSERT, DELETE, UPDATE, SELECT, que os dados de uma sessão jamais seriam visto pelas outras sessões. É como se o ORACLE pegasse a tabela e gerasse um clone vazio da mesma para cada sessão de banco que precisasse popular ou manipular dados na mesma.

Abraços,

Sergio Coutinho