- Este tópico contém 13 respostas, 4 vozes e foi atualizado pela última vez 13 anos, 6 meses atrás por mpvargas.
-
AutorPosts
-
16 de junho de 2011 às 7:46 pm #99674mpvargasParticipante
Caros Amigos,
Criei uma view e gostaria de colocar uma variavel para que deseja digitada a data (Mes/Ano)… fiz algumas pesquisas e pelo que vi isso nao é possível, a nao ser que seja criada uma procedure e nela essa tal variavel…
Sendo assim fiz a procedure, que é bem simples, mas nao estou conseguindo identificar o errocreate or replace PROCEDURE “P_VERBAS_PROF” (v_data IN CHAR) AS
BEGIN
Select rd_filial, rd_mat, rd_pd, RV_DESC, rd_datarq, rd_horas, rd_valor
from srd010 srd, srv010 srv
where rd_pd in (‘A17′,’A18′,’A19′,’003’)
and rd_pd = rv_cod
and srd.D_E_L_E_T_ <> ‘*’
and rd_datarq = v_data
order by rd_filial, rd_mat
;
END;Error(4,3): PLS-00428: an INTO clause is expected in this SELECT statement
16 de junho de 2011 às 7:52 pm #99675felipegParticipante[quote=”mpvargas”:18w3uu7h]Caros Amigos,
Criei uma view e gostaria de colocar uma variavel para que deseja digitada a data (Mes/Ano)… fiz algumas pesquisas e pelo que vi isso nao é possível, a nao ser que seja criada uma procedure e nela essa tal variavel…
Sendo assim fiz a procedure, que é bem simples, mas nao estou conseguindo identificar o errocreate or replace PROCEDURE “P_VERBAS_PROF” (v_data IN CHAR) AS
BEGIN
Select rd_filial, rd_mat, rd_pd, RV_DESC, rd_datarq, rd_horas, rd_valor
from srd010 srd, srv010 srv
where rd_pd in (‘A17′,’A18′,’A19′,’003’)
and rd_pd = rv_cod
and srd.D_E_L_E_T_ ‘*’
and rd_datarq = v_data
order by rd_filial, rd_mat
;
END;Error(4,3): PLS-00428: an INTO clause is expected in this SELECT statement[/quote]
Mpvargas boa tarde
Seguinte, pra trazer dados de dentro de uma procedure você precisa inserir esses valores dentro de uma váriavel e depois mostrar as variáveis.
Um exemplo:
SELECT campo1, campo2, campo3 INTO var1, var2, var3 FROM TABELA;
dbms_output.put_line (var1 || var2 || var3);
E outra, se o sistema vai retornar mais de um registro aconselho usar um cursor.
Depois das alterações se ainda tiver algum problema poste o código que verificamos =)
Atenciosamente,
Felipe.16 de junho de 2011 às 7:57 pm #99676burgaParticipanteSempre que você coloca uma consulta direto dentro de um bloco PL/SQL (sem usar cursores nem FOR LOOPs) você deve usar a cláusula INTO pra receber o retorno do SELECT, desta forma:
DECLARE
l_teste CHAR(1);
BEGIN
SELECT dummy INTO l_teste FROM DUAL;
...
...
...
END;
/Mas me parece que isso não vai te atender… O que você realmente está precisando? Pode explicar um pouco melhor??
16 de junho de 2011 às 8:19 pm #99679rmanParticipante[quote=”mpvargas”:3s7t1sth]Caros Amigos,
Criei uma view e gostaria de colocar uma variavel para que deseja digitada a data (Mes/Ano)… fiz algumas pesquisas e pelo que vi isso nao é possível, a nao ser que seja criada uma procedure e nela essa tal variavel…
Sendo assim fiz a procedure, que é bem simples, mas nao estou conseguindo identificar o errocreate or replace PROCEDURE “P_VERBAS_PROF” (v_data IN CHAR) AS
BEGIN
Select rd_filial, rd_mat, rd_pd, RV_DESC, rd_datarq, rd_horas, rd_valor
from srd010 srd, srv010 srv
where rd_pd in (‘A17′,’A18′,’A19′,’003’)
and rd_pd = rv_cod
and srd.D_E_L_E_T_ ‘*’
and rd_datarq = v_data
order by rd_filial, rd_mat
;
END;Error(4,3): PLS-00428: an INTO clause is expected in this SELECT statement[/quote]
Desculpe pelo comentario OFF…
Esse SELECT me lembra Microsiga Protheus… 😆
Nome das tabelas tudo codificado, nada humanamente legivel, e coluna D_E_L_E_T_ com * para marcar registro deletado…
Não tenho saudades disso não… 😀
16 de junho de 2011 às 9:44 pm #99681mpvargasParticipanteValeu Amigos … obrigado pela ajuda de todos
Respondendo:felipeg => estou tentando usar algo sem cursor (não sei se é possível) para ver se fica mais rápido
burga => o que eu preciso é bem simples, quero que ao ser executada a procedure seja colocada uma data (mes/ano) e atraves desse valor será exibido o resultado do select… como essa tabela é muito grande, gostaria de pegar os valores de uma view
rman => isso é microsiga protheus (hehehe) feliz de você que já se livrou disso…
16 de junho de 2011 às 10:06 pm #99682burgaParticipante[quote=”mpvargas”:3jqz74h4]burga => o que eu preciso é bem simples, quero que ao ser executada a procedure seja colocada uma data (mes/ano) e atraves desse valor será exibido o resultado do select… como essa tabela é muito grande, gostaria de pegar os valores de uma view[/quote]
Entendi, mas neste caso, se é só pra melhorar o desempenho, essa solução não vai ser diferente de fazer sua consulta direta pela aplicação ou através de uma VIEW. Só se fosse uma view materializada que ia adiantar alguma coisa… E mais, isso se essa procedure for rodada apenas uma vez e todos acessarem os usuários mesmos dados com a mesma data de uma vez. Se a data diferir a todo momento acaba não adiantando nada também…
Se todos os usuários acessarem com a mesma data, e esta só mudar a cada determinado período, aí o que pode ajudar é você criar uma tabela pra ser populada periodicamente pelo select com a data correta, aí sim ia adiantar alguma coisa no desempenho, sem ter que ficar recriando uma view materializada.
16 de junho de 2011 às 11:12 pm #99684mpvargasParticipanteEntendi burga
Obrigado pela dica
Vou tentar uma outra estratégia.16 de junho de 2011 às 11:21 pm #99685mpvargasParticipanteUma dúvida
Nessa tabela eu tenho um campo DATA (ano,mes)
Se eu criar uma VIEW e nessa view eu definir que a data é maior do que Janeiro de 2010 (201001) por exemplo…
Aí, ao invés da pessoa acessar a tabela toda, acessa a VIEW e coloca o mês/ano desejado, tipoSELECT * FROM VIEW
WHERE DATA = ‘201105’Isso é válido? Porque nesse caso a View tem somente uns 30% do total da tabela… ou nao adiantaria muita coisa?
17 de junho de 2011 às 2:33 am #99686burgaParticipanteSe a view não é materializada não adianta muita coisa… Isso porque sempre o Oracle vai executar a consulta que monta a view quando você consultá-la. Por exemplo (bem tosco mas que dá pra ilustrar um pouco):
Se a sua view é da seguinte forma:
CREATE VIEW teste AS
SELECT dummy FROM dualE você faz um select:
SELECT dummy FROM teste WHERE dummy = 'X';
Por traz, o oracle está fazendo algo do tipo:
SELECT teste.dummy
FROM (SELECT dummy FROM dual) teste
WHERE teste.dummy = 'X';Ou seja, a sua VIEW vai servir somente pra simplificar algumas coisas… É claro que uma view não serve só praa isso, mas nesse caso, o que eu quero dizer é que você não vai ter o resultado que deseja tanto.
Mas, por outro lado, se você criar uma view materializada já é outra história. E ainda você pode indexar a coluna de data na mview pra melhorar ainda mais a performance das suas consultas…
17 de junho de 2011 às 7:15 pm #99694rmanParticipante[quote=”burga”:1jexprv6]Se a view não é materializada não adianta muita coisa… Isso porque sempre o Oracle vai executar a consulta que monta a view quando você consultá-la. Por exemplo (bem tosco mas que dá pra ilustrar um pouco):
Se a sua view é da seguinte forma:
CREATE VIEW teste AS
SELECT dummy FROM dualE você faz um select:
SELECT dummy FROM teste WHERE dummy = 'X';
Por traz, o oracle está fazendo algo do tipo:
SELECT teste.dummy
FROM (SELECT dummy FROM dual) teste
WHERE teste.dummy = 'X';Ou seja, a sua VIEW vai servir somente pra simplificar algumas coisas… É claro que uma view não serve só praa isso, mas nesse caso, o que eu quero dizer é que você não vai ter o resultado que deseja tanto.
Mas, por outro lado, se você criar uma view materializada já é outra história. E ainda você pode indexar a coluna de data na mview pra melhorar ainda mais a performance das suas consultas…[/quote]
Burga, o raciocínio do nosso amigo não está correto ? O ganho é muito pouco que nem compensa ?
Por que seria assim:
SELECT *
FROM (
SELECT *
FROM TABELA
WHERE DATA >= '201001'
) T
WHERE T.DATA = '201105'
Como ele disse a condição DATA >= ‘201001’ retornaria 30% da tabela…
17 de junho de 2011 às 10:31 pm #99704mpvargasParticipanteCaros amigos,
… fiquei na dúvida, compensa ou não?
Burga, já li algumas coisas sobre “view materializada” mas ainda não implementei… vc poderia me passar um exemplo de como eu poderia fazer?
Obrigado17 de junho de 2011 às 11:55 pm #99713burgaParticipante[quote=”rman”:8yd26m3r]Burga, o raciocínio do nosso amigo não está correto ? O ganho é muito pouco que nem compensa ?
Por que seria assim:
SELECT *
FROM (
SELECT *
FROM TABELA
WHERE DATA >= '201001'
) T
WHERE T.DATA = '201105'
Como ele disse a condição DATA >= ‘201001’ retornaria 30% da tabela…[/quote]
É que uma view não materializada não armazena fisicamente os dados de retorno. Então ela sempre vai executar a consulta que a “monta” quando ela for acessada. Isso dá uma falsa impressão de que você só está acessando os 30% dos dados da tabela original, mas antes disso, a consulta que monta a view está sendo executada na tabela original pra poder extrair estes 30%.
Burga, já li algumas coisas sobre “view materializada” mas ainda não implementei… vc poderia me passar um exemplo de como eu poderia fazer?
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6002.htm
CREATE MATERIALIZED VIEW sua_mview
PCTFREE 5 PCTUSED 60
TABLESPACE example
STORAGE (INITIAL 50K NEXT 50K)
USING INDEX STORAGE (INITIAL 25K NEXT 25K)
REFRESH START WITH ROUND(SYSDATE + 1) + 11/24
NEXT NEXT_DAY(TRUNC(SYSDATE), 'MONDAY') + 15/24
AS
Select rd_filial, rd_mat, rd_pd, RV_DESC, rd_datarq, rd_horas, rd_valor
from srd010 srd, srv010 srv
where rd_pd in ('A17','A18','A19','003')
and rd_pd = rv_cod
and srd.D_E_L_E_T_ '*'
and rd_datarq > 201001
order by rd_filial, rd_mat
;A parte de cima copiei do link, mas são só parametros de storage e refresh da mview…
18 de junho de 2011 às 12:03 am #99714rmanParticipante[quote=”burga”:2xsanbq4][quote=”rman”:2xsanbq4]Burga, o raciocínio do nosso amigo não está correto ? O ganho é muito pouco que nem compensa ?
Por que seria assim:
SELECT *
FROM (
SELECT *
FROM TABELA
WHERE DATA >= '201001'
) T
WHERE T.DATA = '201105'
Como ele disse a condição DATA >= ‘201001’ retornaria 30% da tabela…[/quote]
É que uma view não materializada não armazena fisicamente os dados de retorno. Então ela sempre vai executar a consulta que a “monta” quando ela for acessada. Isso dá uma falsa impressão de que você só está acessando os 30% dos dados da tabela original, mas antes disso, a consulta que monta a view está sendo executada na tabela original pra poder extrair estes 30%.
[/quote]É verdade, pra chegar nos 30%, teve o custo do 100% do mesmo jeito…
Pode se utilizar particionamento de tabela para melhorar o desempenho ? Ou neste caso, realmente VIEW MATERIALIZADA é a melhor solução ?
18 de junho de 2011 às 12:48 am #99716mpvargasParticipanteBurga
Obrigado pela ajudarman
essa tabela já é particionada, no caso por ANO, mas mesmo assim ainda fica com muitos registros -
AutorPosts
- Você deve fazer login para responder a este tópico.