Re: [oracle_br] Ajuda Criar Função com Pragma
Eduardo, só uma obs em cima : o que o Alessandro falou é *** muito ***, mas MUITO Sério, mesmo : a questão é que no RDBMS Oracle automagicamente um SELECT enxerga os dados *** exatamente *** como eles estavam no instante X em que o SELECT começou a ser executado - mesmo que posteriormente em x+y vc faça o que fizer (UPDATE, DELETE, o que quiser!!! : e comite vc ou não os DMLs !!) , o SELECT vai mostrar os dados como estavam em X Exemplificando : imagine que a tua procedure disparou e startou o SELECT principal do report na tabela T às 10:00h, e esse SELECT é longo e demora uns bons minutos para executar... Aí, ainda com o SELECT sendo executado, as 10h01m (digamos) vc fez (via AUTONOMOUS TRANSACTION, que basicamente abre uma outra sessão independente da atual) um UPDATE nessa mesma tabela T - comite ou não vc esse UPDATE, a query que começou ás 1-h e está rodando ainda NÃO vai enxergar essa alteração, aí se ela faz digamos um COUNT, vc VAI SIM ter resultado diferente do real... Sim ??? Perigoso o bastante pra vc ??? Vc TEM que se assegurar que o UPDATE não interfere em nenhuma coluna sendo lida pela query, justamente sob pena da query em execução NÂO ver essas alterações... E veja que eu nem estou falando de acesso multi-usuário : veja vc, se vc deixar ** É CLARO ** que esse report que faz alterações VAI cedo ou tarde ser disparado 2x ao mesmo tempo por dois usuários diferentes da Aplicação, e aí, como faz ?? Lost update mais que provável, né não ?? ==> São esses tipos de coisa que temos que ter em mente antes de sair gambiarrando sem conhecer o mecanismo de transações e consistência de leitura do RDBMS Oracle, yep yep ??? Pelo que entendi, o que vc quer é que, cfrme os dados vão sendo lidos e impressos, faça-se um UPDATE para cada registro lido, certo ?? Normalmente, para evitar lost update o que se faz é SERIALIZAR o acesso, com SELECT FOR UPDATE ou com LOCK TABLE, e para permitir DMLs na procedure se vc dizer exatamente qual tool de report vc está usando quem usa a mesma pode dar a dica de como se faz isso na tool.. Praticamente todas as tools de Report realmente proíbem DMLs na procedure que alimenta a query mas Permitem triggers PRE/POST report e quetais... []s Chiappa
Re: [oracle_br] Ajuda Criar Função com Pragma
Vitor...já está assim. Alessandro, concordo..é gambiarra mesmo...solução de contorno emergencial... Em 28/10/2014 15:53, "Alessandro Lúcio Cordeiro da Silva alecordeirosi...@yahoo.com.br [oracle_br]" escreveu: > > > > > Boa tarde Eduardo, > > Eu no geral não vejo com bons olhos o uso do Pragma > Autonomuos_transaction, há situações sim que elas podem ser usadas, mas > geralmente uma exceção. > > O que ainda mais me preocura é você querer usar dentro de uma consulta, > olhe tecnicamente falando isso vaifuncionar, todavia isso beira a uma > gambiarra. Imagine a dificuldade que novos desenvolvedores/progamadores > terão de entender a "lógica" disso, sendo que esta logica quebra todo > conceito de consistência de leitura, ( a cada linha da consulta um commit, > então imagine a bagunça de outras consultas feitas durante a execução da 1º > consulta) e ainda que consultas SQL's não abrem transação. > > Eu fortemente recomendo que você reveja a sua lógica, e tente usar os > padrões de desenvolvimento para aumentar a coesão e diminuir o acoplamento, > senão você acaba tendo um sistema que parece uma linguiça. > > Alessandro Lúcio Cordeiro da Silva > Analista de Sistema > þ http://alecordeirosilva.blogspot.com/ > Porque esta é a vontade de Deus, a saber, a vossa > santificação: que vos abstenhais da prostituição. > (1º Tessalonicenses 4:3) > > > > Em Terça-feira, 28 de Outubro de 2014 13:13, "Eduardo Perdomo > panc...@gmail.com [oracle_br]" escreveu: > > > > Boa tarde. > > Tenho as seguintes tabelas: > > carregamentos > numcar data posicao etc > > pedidositens > codprod qtd valor numcar conferente > > O relacionamento entre as duas é numcar > > Preciso fazer uma função que quando eu passe o numero do carregamento o > conferente seja atualizado para todos os itens que estão nessa carga. > > Vários pedidositens podem estar no mesmo carregamento. Talvez tenha que > fazer um FOR EACH > > Vou usar esse função dentro de uma consulta em um relatorio, por isso o > pragma. > > Segue abaixo minha tentativa: > > CREATE OR REPLACE > FUNCTION liberacarregamento( yNUMCAR pedidositens.numcar%TYPE) RETURN > VARCHAR2 > IS > PRAGMA AUTONOMOUS_TRANSACTION; -- PARA PERMITIR DAR UPDATE EM UM SELECT > XNUMCAR pedidositens.numcar%TYPE; > BEGIN > BEGIN > UPDATE pedidositens SET conferente = 1 WHERE NUMCAR = yNUMCAR; > COMMIT; > > EXCEPTION > WHEN OTHERS THEN > RAISE_APPLICATION_ERROR(-20001, ('ERRO AO ATUALIZAR O > CARREGAMENTO: ' + to_char(XNUMCAR) ) ); > END; > RETURN xnumcar ; > END; > / > > > > > > > > > -- > > Eduardo Perdomo > Consultor de Implantação > Grupo PC Sistemas - www.grupopc.com.br > (21) 6845-8592 > panc...@gmail.com > eduardo.perd...@pcinformatica.com.br > Blog: eduardo.perdomo.nom.br > > > >
Re: [oracle_br] Ajuda Criar Função com Pragma
Olá, Desculpe, eu não encontrei a dúvida.Mas, interpretrei dessa forma:Você tem o número do carregamento em ambas as tabelas(o mesmo número).Você quer atualizar só o conferente na tabela pedidositens quando você passar o número do carregamento.Se for isso mesmo, porque não fazer só um update direto?Update pedidositens set conferente = n_conferente where carregamento = n_carregamento.Isso ai vai atualizar para todos os pedidositens daquele carregamento o número do conferente.Se não tem nada a ver com isso, desculpe a má interpretração. Em Terça-feira, 28 de Outubro de 2014 14:13, "Eduardo Perdomo panc...@gmail.com [oracle_br]" escreveu: Boa tarde. Tenho as seguintes tabelas: carregamentosnumcar data posicao etc pedidositenscodprod qtd valor numcar conferente O relacionamento entre as duas é numcar Preciso fazer uma função que quando eu passe o numero do carregamento o conferente seja atualizado para todos os itens que estão nessa carga. Vários pedidositens podem estar no mesmo carregamento. Talvez tenha que fazer um FOR EACH Vou usar esse função dentro de uma consulta em um relatorio, por isso o pragma. Segue abaixo minha tentativa: CREATE OR REPLACE FUNCTION liberacarregamento( yNUMCAR pedidositens.numcar%TYPE) RETURN VARCHAR2IS PRAGMA AUTONOMOUS_TRANSACTION; -- PARA PERMITIR DAR UPDATE EM UM SELECTXNUMCAR pedidositens.numcar%TYPE;BEGIN BEGIN UPDATE pedidositens SET conferente = 1 WHERE NUMCAR = yNUMCAR; COMMIT; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001, ('ERRO AO ATUALIZAR O CARREGAMENTO: ' + to_char(XNUMCAR) ) ); END; RETURN xnumcar ;END;/ -- Eduardo PerdomoConsultor de ImplantaçãoGrupo PC Sistemas - www.grupopc.com.br (21) 6845-8592pancary@gmail.comeduardo.perd...@pcinformatica.com.brBlog: eduardo.perdomo.nom.br
Re: [oracle_br] Ajuda Criar Função com Pragma
Boa tarde Eduardo, Eu no geral não vejo com bons olhos o uso do Pragma Autonomuos_transaction, há situações sim que elas podem ser usadas, mas geralmente uma exceção. O que ainda mais me preocura é você querer usar dentro de uma consulta, olhe tecnicamente falando isso vaifuncionar, todavia isso beira a uma gambiarra. Imagine a dificuldade que novos desenvolvedores/progamadores terão de entender a "lógica" disso, sendo que esta logica quebra todo conceito de consistência de leitura, ( a cada linha da consulta um commit, então imagine a bagunça de outras consultas feitas durante a execução da 1º consulta) e ainda que consultas SQL's não abrem transação. Eu fortemente recomendo que você reveja a sua lógica, e tente usar os padrões de desenvolvimento para aumentar a coesão e diminuir o acoplamento, senão você acaba tendo um sistema que parece uma linguiça. Alessandro Lúcio Cordeiro da Silva Analista de Sistema þ http://alecordeirosilva.blogspot.com/ Porque esta é a vontade de Deus, a saber, a vossa santificação: que vos abstenhais da prostituição. (1º Tessalonicenses 4:3) Em Terça-feira, 28 de Outubro de 2014 13:13, "Eduardo Perdomo panc...@gmail.com [oracle_br]" escreveu: Boa tarde. Tenho as seguintes tabelas: carregamentos numcar data posicao etc pedidositens codprod qtd valor numcar conferente O relacionamento entre as duas é numcar Preciso fazer uma função que quando eu passe o numero do carregamento o conferente seja atualizado para todos os itens que estão nessa carga. Vários pedidositens podem estar no mesmo carregamento. Talvez tenha que fazer um FOR EACH Vou usar esse função dentro de uma consulta em um relatorio, por isso o pragma. Segue abaixo minha tentativa: CREATE OR REPLACE FUNCTION liberacarregamento( yNUMCAR pedidositens.numcar%TYPE) RETURN VARCHAR2 IS PRAGMA AUTONOMOUS_TRANSACTION; -- PARA PERMITIR DAR UPDATE EM UM SELECT XNUMCAR pedidositens.numcar%TYPE; BEGIN BEGIN UPDATE pedidositens SET conferente = 1 WHERE NUMCAR = yNUMCAR; COMMIT; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001, ('ERRO AO ATUALIZAR O CARREGAMENTO: ' + to_char(XNUMCAR) ) ); END; RETURN xnumcar ; END; / -- Eduardo Perdomo Consultor de Implantação Grupo PC Sistemas - www.grupopc.com.br (21) 6845-8592 panc...@gmail.com eduardo.perd...@pcinformatica.com.br Blog: eduardo.perdomo.nom.br
[oracle_br] Ajuda Criar Função com Pragma
Boa tarde. Tenho as seguintes tabelas: carregamentos numcar data posicao etc pedidositens codprod qtd valor numcar conferente O relacionamento entre as duas é numcar Preciso fazer uma função que quando eu passe o numero do carregamento o conferente seja atualizado para todos os itens que estão nessa carga. Vários pedidositens podem estar no mesmo carregamento. Talvez tenha que fazer um FOR EACH Vou usar esse função dentro de uma consulta em um relatorio, por isso o pragma. Segue abaixo minha tentativa: CREATE OR REPLACE FUNCTION liberacarregamento( yNUMCAR pedidositens.numcar%TYPE) RETURN VARCHAR2 IS PRAGMA AUTONOMOUS_TRANSACTION; -- PARA PERMITIR DAR UPDATE EM UM SELECT XNUMCAR pedidositens.numcar%TYPE; BEGIN BEGIN UPDATE pedidositens SET conferente = 1 WHERE NUMCAR = yNUMCAR; COMMIT; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001, ('ERRO AO ATUALIZAR O CARREGAMENTO: ' + to_char(XNUMCAR) ) ); END; RETURN xnumcar ; END; / -- Eduardo Perdomo Consultor de Implantação Grupo PC Sistemas - www.grupopc.com.br (21) 6845-8592 panc...@gmail.com eduardo.perd...@pcinformatica.com.br Blog: eduardo.perdomo.nom.br