- Este tópico contém 45 respostas, 4 vozes e foi atualizado pela última vez 15 anos, 8 meses atrás por
Maths.
-
AutorPosts
-
25 de junho de 2010 às 11:07 pm #94834
burga
ParticipanteEntrando bem profundamente no Oracle Crystal Ball Reports, uma coisa que pode estar ocorrendo, já que você disse que os registros em lock NÃO SÃO RETORNADOS PELA CONSULTA NA TABELA, é que uma das aplicações concorrentes (ou ambas) pode estar utilizando o SELECT FOR UPDATE SKIP LOCKED…
Pois se fosse somente o SELECT FOR UPDATE NOWAIT, para uma ou para as duas aplicações concorrentes, uma consulta na tabela retornaria também os registros em lock ou retornaria uma exceção.
Ficou meio confusoo post, espero que entenda… 😆
Mas o certo mesmo é verificar o que as aplicações estão fazendo, como o fsitja já disse…
26 de junho de 2010 às 12:00 am #94835fsitja
ParticipanteUmm… se for isso mesmo, então até daria para simular rodando um SQL filtrando essas linhas no where com um for update. Mas depende da aplicação estar usando “skip locked”, o que é um pouco incomum.
26 de junho de 2010 às 9:10 am #94836vieri
ParticipanteNão entendi porque o seui chefe riu…
Provavelmente ele saca mto pouco de Oracle.
Simplesmente não “existe” um
comando chamado alter table XPTO lock rows id=1,2,3,4
muito menos uma maneira de fazer um “stream” dessess lock para outro ambiente, por isso as respostas foram com lógica de programação.Acho que ele deve abrir um chamado no metalink e questionar a Oracle se existe alguma package liberada para nós mortais que faça isso.
27 de junho de 2010 às 2:04 am #94837fsitja
ParticipanteA questão toda é que, nos seus fundamentos e conceituação do banco de dados, a Oracle sempre enfatiza que usuários escrevendo dados não devem ser capazes de bloquear a leitura dos demais usuários, e vice-versa. É o chamado Multi-Version Concurrency Control, ou MVCC. Não há como burlar ou desativar esse mecanismo, apenas como estendê-lo para níveis maiores de “isolation level” mais restritivos que o padrão read committed.
Dessa forma esses controles de bloqueio de leitura e gravação sempre devem ser feitos pela aplicação.
28 de junho de 2010 às 4:22 pm #94841Maths
ParticipantePorra galera, seis manjam mtu heauoahEAUeo, eu sou um mero newbie que fiz apenas um curso de desenvolvedor oracle 6 modulos..
SQL
PL
Forms
Reports
Modelagem
OtimizaçãoOu seja, esse aqui é meu 1 emprego, é um estágio, mas a empresa é mtu promissora, minhas chances de crescer aqui são altas, mas depende de min né, e eu ainda estou engatinhando vamos dizer assim.. por isso encho o saco de voceis heuahaueohuEOAO
Mas é isso mesmo galera, fiquei os ultimos 3 dias da semana passada fuçando na net sobre isso, até cansou sabe?? Mas meu chefe abriu um chamado lá na empresa para vir alguem e ver o que realmente está acontecendo, ou seja, vou perguntar a ele o que ele quer q eu faça a partir de hoje… se ele me mandar continuar fuçando sobre Lock, eu me jogo da janela =), tomara q ele me libere desta função hehehe, vou informar a ele sobre as ultimas mensagens e talz, e jajá informo a voceis a reação e a resposta dele aehaEOUAEHUoae.
Abraçãooo e muito obrigado!
28 de junho de 2010 às 6:08 pm #94842vieri
ParticipanteLi por alto novamente todas as postagens
e em dado momento vc diz que a origem dos problemas
é que aplicação fica bloqueada e não cosneguem identificar a
causa real do problema correto?!
No momento do problema tente responder esses questionamentos abaixo e poderá esclarecer as coisas.1)Quem está bloqueando quem ?
2)Qual objetos é disputado pelas sessões ?
3)Qual linha da tabela está obstruida ?
4) O que o usuário está rodando?
Respostas.1)
•SELECT substr(DECODE(request,0,’Holder: ‘,’Waiter: ‘)||sid,1,12) sess,
id1, id2, lmode, request, type, inst_id
FROM GV$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM GV$LOCK WHERE request>0)
ORDER BY id1, request;2)
•select do.owner
, do.object_name
, row_wait_obj#
, row_wait_file#
, row_wait_block#
, row_wait_row#
, dbms_rowid.rowid_create (1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#,
ROW_WAIT_BLOCK#, ROW_WAIT_ROW#)
from gv$session s
, dba_objects do
where sid= SID – Waiter da query 1
and s.ROW_WAIT_OBJ# = do.OBJECT_ID
/
3)•select * from owner.table where
rowid = rowid – obtido na query 2 ;
— está query só funciona no momento da contenção4)
Select * from v$open_cursor where sid = ‘Coleaquiodisbloqueadonaprimeiraconsulta’😯
se for só isso… o Brasil goleia o chile hoje!! rsrs 😯
28 de junho de 2010 às 6:50 pm #94844fsitja
ParticipanteMuito bom Vieri.
Sticky no post DBA 101. 😀
Bola na rede Brasil, fora Dunga!
28 de junho de 2010 às 7:54 pm #94847Maths
ParticipanteGalera, duvidazinha besta aqui, meu chefe mandou eu pegar a tabela de 17k de linhas e deletar apenas UMA dela, ele me passou o identificador dessa linha, mandou eu deletar essa linha apenas e depois inserir a mesma linha com as mesmas colunas porem apenas alterando alguns dados de antes.. eu fiz a query seguinte:
delete from dfl.wsf_ds_8601_c
where identificador_psys = ‘RCCF1606-1-170164335’Outra coisa, após eu deletar ela (se eu conseguir né) como ficaria a sintaxe de inclusão, seria esta:
INSERT INTO dfl.wsf_ds_8601_c (
COLUNA1,
COLUNA2,
COLUNA3,
COLUNA4)
VALUES (
VALORCOLUNA1,
VALORCOLUNA2,
VALORCOLUNA3,
VALORCOLUNA4)POREM.. ai que esta o problema, tenho o campo START_TIME E O END_TIME, ambos sao formato DDMMYYYY HH:MM:SS, tipo assim 28/06/2010 15:15:00, como eu insiro isso?? a variavel é do tipo number, eu tenho que grudar tudo?? 28062010151500?? seria assim?? qual o formato para inserir dessa maneira, outra coisa, tem uma coluna ali tb na inserção que ele quer a data atual do sistema, ou seja sysdate.. é so colocar sysdate??
29 de junho de 2010 às 5:47 am #94851vieri
Participantese tiver PK, vai dar erro de costraint.
29 de junho de 2010 às 5:10 pm #94854Maths
ParticipanteGalera, continuando o problema acima, meu chefe me deu a PK da linha que ele queria excluir, eu fui e deletei a linha de acordo com a PK q ele me deu “1row deleted” otimo, dei um count na tabela e realmente deletou a linha, ai ele mandou eu inserir a MESMA linha, com a MESMA PK porem inserindo dados diferentes em 5 colunas, o resto deixar null mesmo pq estamos testando.. entao fiz isso:
insert into dfl.wsf_ds_8805_c (
start_time,
end_time,
status,
identificador_psys,
impacto,
dta_ult_alt)
values (
1276640880000,
1276689660000,
‘FECHADO’,
‘RCCF1506-1-170152498’,
‘ALTERADO’,
TO_NUMBER(SYSDATE))Porem estou com problemas, no campo ali dta_ult_alt ele é number, e contem data la dentro, e meu chefe disse, matheus eu quero naquela coluna agora a DATA DO SISTEMA e nao a que estava antes, ai eu tentei o sysdate sozinho e ele deu pal falando q esperava NUMBER e eu dei DATE.. ai pensei em fazer esse TO_NUMBER e o sysdate.. mas ele dá pal
ORA-01722 invalid number.
Alguem poderia solucionar isso? sou novato ainda =P
Edit: Galera, estava usando PL/SQL DEVELOPER atraves de uma VMWARE, um servidor, meu chefe disse para eu usar o PL/SQL só que de outra VMWARE que lá tinha um banco igual ao q eu estava usando e ja tinha oracle insataldo, desconectei da minha seção nessa vm, troquei o IP pelo novo servidor e lá estava o PL/SQL DEVELOPER, o icone, entrei nele POREM ELE nao esta NADINHA configurado, como se fosse instalado agora, a base de dados esta instalada, é a mesma q eu estava usando, porem como eu conecto o PL/SQL ao banco instalado?? dei uma fuçada e nao achei nada =/ como eu conecto o PL ao banco?
29 de junho de 2010 às 6:52 pm #94855fsitja
ParticipanteO campo dta_ult_alt é que tipo?
Provavelmente seja ou date ou varchar2. O correto seria que esse campo fosse date, pois armazenar datas como varchar2 é uma tremenda dor-de-cabeça, não deve ser feito.
Você vai ter que fazer um to_char para converter para o formato de destino em caracteres, usando a máscara de conversão.
Exemplo:
to_char(sysdate, 'DDMMYYYY HH24:MI:SS')
ou simplesmente sysdate se for tipo date.
Mas armazenar datas como caracteres é fria vai dar inconsistências de datas inválidas e criar problemas mais cedo ou mais tarde.
29 de junho de 2010 às 7:21 pm #94856Maths
ParticipanteNao é nem data nem varchar2, é number mesmo essa porra.. se eu uso o sysdate ele me da erro falando, voce colocou date num campo esperado que seja number, tendeu?? Ou seja.. to tentando colocar sysdate(data) na variavel que é tipo number, ele nao me deixa.. ai eu usei o TO_NUMBER, tendeu??
29 de junho de 2010 às 8:35 pm #94858burga
ParticipanteNão existe maneira de converter data em número, você precisa saber é que valor que vai nesta coluna, o que específicamente este número representa…
Exemplo: o número de dias a partir de uma data pré-determinada.
Estude quais os dados (valores mesmo) que contém na coluna e veja na documentação (espero que exista) o que a coluna deve armazenar. Se a coluna está sem dados, então pode ser que o tipo dela que está errado mesmo…
29 de junho de 2010 às 8:40 pm #94859Maths
ParticipanteEssa coluna dta_ult_alt significa DATA DA ULTIMA ALTERAÇÃO, ou seja, a ultima vez que aquele registro foi alterado, nela continha DATA, todas contem data.. DD/MM/YYYY HH/MM/SS nesse formato, mas meu chefe disse, matheus nao quero mais a data antiga que estava, eu quero a data atual do sistema, ou seja, quero o sysdate ali dentro.. ai beleza, como a coluna ja continha data e talz, eu botei o sysdate mas ele dá pal falando q eu to tentando colocar DATA no tipo NUMERO, entendeu?? ou seja, o tipo da coluna é number e nao date, por isso o sysdate nao funciona, o q eu tenho q fazer para enfiar o sysdate ali dentro??
29 de junho de 2010 às 9:17 pm #94864fsitja
ParticipanteBom… se armazenar data como varchar2 já é uma coisa bem ruim, armazenar como número é… terrível, perto do inviável, como disse o Burga já, pois não faz sentido.
Por que? Porque não há como setar um formato fixo com a máscara que você postou (DDMMYYYY etc…). Se for number mesmo, os zeros à esquerda são eliminados, e você tem um problema nas mãos pois a máscara foi para o espaço, ficou DMMYYYY.
Se o ano fosse primeiro até daria (YYYYMMDD). Como está é bem mais complicado. Dá uma olhada, faz um describe na tabela e vê o type, depois olha os dados dentro dela e posta um sample para nós.
-
AutorPosts
- Você deve fazer login para responder a este tópico.