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!
Ideias para uma query
-
- Rank: Analista Júnior
- Mensagens: 72
- Registrado em: Sex, 18 Nov 2011 4:51 pm
-
- Moderador
- Mensagens: 641
- Registrado em: Seg, 03 Set 2007 3:26 pm
- Localização: Fortaleza - CE
att,
Daniel N.N.
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.
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.
-
- 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.
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.
- stcoutinho
- 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
Abraços,
Sergio Coutinho
Se você pensava em criar uma "temp table", dê uma olhada no assunto
GLOBAL TEMPORARY TABLE
.Abraços,
Sergio Coutinho
- gpereira
- 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
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:
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
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:
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 ;
Mais informações sobre tabelas temporarias:
http://www.devmedia.com.br/tabelas-temp ... racle/1915
{}'s
- stcoutinho
- 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
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
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Bing [Bot] e 13 visitantes