Ideias para uma query

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

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!
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

"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.
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

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.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Rafael,

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

Abraços,

Sergio Coutinho
Avatar do usuário
gpereira
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Sáb, 10 Dez 2011 10:56 am
Gustavo Antonio Pereira
OCA Oracle Database 10g Administrator Certified Associate

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
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

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
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes