Pular para o conteúdo
Visualizando 15 posts - 31 até 45 (de 46 do total)
  • Autor
    Posts
  • #94834
    burga
    Participante

      Entrando 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…

      #94835
      fsitja
      Participante

        Umm… 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.

        #94836
        vieri
        Participante

          Nã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.

          #94837
          fsitja
          Participante

            A 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.

            #94841
            Maths
            Participante

              Porra 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ção

              Ou 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!

              #94842
              vieri
              Participante

                Li 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ção

                4)
                Select * from v$open_cursor where sid = ‘Coleaquiodisbloqueadonaprimeiraconsulta’

                😯

                se for só isso… o Brasil goleia o chile hoje!! rsrs 😯

                #94844
                fsitja
                Participante

                  Muito bom Vieri.

                  Sticky no post DBA 101. 😀


                  Bola na rede Brasil, fora Dunga!

                  #94847
                  Maths
                  Participante

                    Galera, 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??

                    #94851
                    vieri
                    Participante

                      se tiver PK, vai dar erro de costraint.

                      #94854
                      Maths
                      Participante

                        Galera, 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?

                        #94855
                        fsitja
                        Participante

                          O 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.

                          #94856
                          Maths
                          Participante

                            Nao é 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??

                            #94858
                            burga
                            Participante

                              Nã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…

                              #94859
                              Maths
                              Participante

                                Essa 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??

                                #94864
                                fsitja
                                Participante

                                  Bom… 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.

                                Visualizando 15 posts - 31 até 45 (de 46 do total)
                                • Você deve fazer login para responder a este tópico.