Re: [oracle_br] Ajuda Criar Função com Pragma

2014-10-28 Por tôpico jlchia...@yahoo.com.br [oracle_br]
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

2014-10-28 Por tôpico Eduardo Perdomo panc...@gmail.com [oracle_br]
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

2014-10-28 Por tôpico Victor Freidinger victor_freidin...@yahoo.com.br [oracle_br]
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

2014-10-28 Por tôpico Alessandro Lúcio Cordeiro da Silva alecordeirosi...@yahoo.com.br [oracle_br]


 
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

2014-10-28 Por tôpico Eduardo Perdomo panc...@gmail.com [oracle_br]
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