Pular para o conteúdo

Marcado: 

  • Este tópico contém 21 respostas, 3 vozes e foi atualizado pela última vez 1 dia, 12 horas atrás por Avatar de lucianalopeslucianalopes.
Visualizando 7 posts - 16 até 22 (de 22 do total)
  • Autor
    Posts
  • #177846
    Avatar photoJosé Laurindo Chiappa
    Moderador

      OK, vamos por partes : Primeiro, não precisa enviar o arquivo, não – não importa o conteúdo, o seu arquivo .XML sendo arquivo TEXTO, e Estando Formatado no padrão de quebra de linhas do Windows (isso é importante – não é difícil vc encontrar pelaí na internet aqruivos com quebras de linha padrão Linux/UNIX), o LOAD vai ser capaz de o ler, desde que os próximos pontos SEJAM respeitados :

      a) o arquivo *** TEM *** que ser um arquivo DE TEXTO : se esse arquivo contiver IMAGENS ou caracteres de controle ocultos ou trechos de dados binários, COM CERTEZA o LOADCLOBFROM FILE ** NÃO FUNFA ** : esse C do CLOB significa Character, TEM QUE SER UM TEXTO….

      b) esse erro “ORA-22285” é genérico , ele TANTO aparece se o arquivo não existir QUANTO se o Arquivo OU a pasta em si não estiver permissionada para o usuário Windows que roda o SGBD Oracle (*** NÃO É *** o usuário que vc está logada MAS sim o usuário que efetivamente EXECUTA o SGBD ORACLE), ou no mínimo para um dos Grupos que esse usuário é membro… Assim sendo, PLZ CHEQUE as permissões tanto da pasta quanto do arquivo…
      Os procedimentos para vc checar QUEM é o usuário Windows que roda o SGBD Oracle E as permissões de pastas e arquivos,que eu vou mostrar abaixo, TEM que ser feitas por um Administrador, seja Administrador local, seja administrador de Rede : se nessa máquina Windows seu usuário Não É Admin local, plz peça para teu pessoal de infra fazer ou te dar esse acesso…
      Para verificar QUEM é o usuário que roda o SGBD Oracle, executar o applet services.smc e nas propriedades do serviço OracleServiceXXX.exe (onde XXX é teu SID), veja a aba Logon… Já as permissões da pasta E do arquivo, no Windows Explorer, clickando com botão Direito (tanto na pasta quanto no arquivo) e usando a opção Propriedades e depois aba Segurança, veja lá… Pode aproveitar e fazer um teste adicional, que é : logada nesse Windows com o usuário que roda o SGBD Oracle (ou com usuário Windows membro do grupo ORA_DBA, funciona também) , navegue até a pasta C:\IMAGENS e rode :

      notepad C:\IMAGENS\teste.xml

      e veja se abre ok…

      c) o MAIS IMPORTANTE PONTO depois dessas questões de permissão : do MESMO MODO que os nomes de usuários, os nomes de tabelas, os nomes de colunas, etc, etc, etc, os NOMES DE DIRECTORY *** são *** gravados no Dicionário de dados em MAIÚSCULAS :

      => tentativa de execução com nome de directory em Minúsculas :

      SCOTT@XEPDB1::CONT=XEPDB1> DECLARE
      2 v_lob clob;
      3 l_bfile bfile;
      4 v_qtd_bytes number;
      5 --
      6 l_dest_offset integer := 1;
      7 l_src_offset integer := 1;
      8 l_bfile_csid number := 0;
      9 l_lang_context integer := 0;
      10 l_warning integer := 0;
      11 BEGIN
      12 l_bfile := bfilename( 'data_pump_dir', 'texto_longo.txt');
      13 v_qtd_bytes := dbms_lob.getlength( l_bfile );
      14 dbms_lob.fileopen( l_bfile ,dbms_lob.file_readonly);
      15 -- crio uma linha na tabela com CLOB vazio, E guardo o ponteiro para esse CLOB, usarei no LOAD …
      16 insert into TB_TESTE_CLOB (C1, C2) values (1, empty_clob() ) returning C2 into v_lob;
      17
      18 dbms_lob.loadclobfromfile (
      19 dest_lob => v_lob,
      20 src_bfile => l_bfile,
      21 amount => v_qtd_bytes,
      22 dest_offset => l_dest_offset,
      23 src_offset => l_src_offset,
      24 bfile_csid => l_bfile_csid ,
      25 lang_context => l_lang_context,
      26 warning => l_warning
      27 );
      28 --
      29 dbms_output.put_line('Tamanho do arquivo é:'||dbms_lob.getlength( l_bfile ));
      30 dbms_output.put_line('Bytes lidos e gravados=' ||dbms_lob.getlength(v_lob));
      31 dbms_lob.fileclose( l_bfile );
      32 commit;
      33 END;
      34 /
      DECLARE
      *
      ERRO na linha 1:
      ORA-22285: diretório ou arquivo inexistente para operação GETLENGTH
      ORA-06512: em "SYS.DBMS_LOB", line 867
      ORA-06512: em line 13

      ==> tentativa de execução com nome do directory em MAIÚSCULAS, Sucesso :

      SCOTT@XEPDB1::CONT=XEPDB1> ed
      Gravou file afiedt.buf

      1 DECLARE
      2 v_lob clob;
      3 l_bfile bfile;
      4 v_qtd_bytes number;
      5 --
      6 l_dest_offset integer := 1;
      7 l_src_offset integer := 1;
      8 l_bfile_csid number := 0;
      9 l_lang_context integer := 0;
      10 l_warning integer := 0;
      11 BEGIN
      12 l_bfile := bfilename( 'DATA_PUMP_DIR', 'texto_longo.txt');
      13 v_qtd_bytes := dbms_lob.getlength( l_bfile );
      14 dbms_lob.fileopen( l_bfile ,dbms_lob.file_readonly);
      15 -- crio uma linha na tabela com CLOB vazio, E guardo o ponteiro para esse CLOB, usarei no LOAD …
      16 insert into TB_TESTE_CLOB (C1, C2) values (1, empty_clob() ) returning C2 into v_lob;
      17 dbms_lob.loadclobfromfile (
      18 dest_lob => v_lob,
      19 src_bfile => l_bfile,
      20 amount => v_qtd_bytes,
      21 dest_offset => l_dest_offset,
      22 src_offset => l_src_offset,
      23 bfile_csid => l_bfile_csid ,
      24 lang_context => l_lang_context,
      25 warning => l_warning
      26 );
      27 --
      28 dbms_output.put_line('Tamanho do arquivo é:'||dbms_lob.getlength( l_bfile ));
      29 dbms_output.put_line('Bytes lidos e gravados=' ||dbms_lob.getlength(v_lob));
      30 dbms_lob.fileclose( l_bfile );
      31 commit;
      32* END;
      33 /

      Tamanho do arquivo é:34220
      Bytes lidos e gravados=34218

      Procedimento PL/SQL concluído com sucesso.

      Tá bem ? E eu vi no seu código :

      pasta:=bfilename(‘testetd’,’teste.xml’);

      Tá vendo aí o nome do DIRECTORY em minúsculas ? Isso deve ser erro seu : até é POSSÍVEL criar nome de algum objeto/componente estrutural no Oracle respeitando minúsculas e maiúsculas , colocando ele entre aspas duplas, mas DUVIDO que vc tenha feito isso, e então ESSE É o MOTIVO do ser Erro…

      Obs : o nome do arquivo , como é algo EXTERNO, aí é o Sistema Operacional que controla , e no Windows ele é INDIFERENTE à case :

      SCOTT@XEPDB1::CONT=XEPDB1> ed
      Gravou file afiedt.buf

      1 DECLARE
      2 v_lob clob;
      3 l_bfile bfile;
      4 v_qtd_bytes number;
      5 --
      6 l_dest_offset integer := 1;
      7 l_src_offset integer := 1;
      8 l_bfile_csid number := 0;
      9 l_lang_context integer := 0;
      10 l_warning integer := 0;
      11 BEGIN
      12 l_bfile := bfilename( 'DATA_PUMP_DIR', 'Texto_Longo.txt');
      13 v_qtd_bytes := dbms_lob.getlength( l_bfile );
      14 dbms_lob.fileopen( l_bfile ,dbms_lob.file_readonly);
      15 -- crio uma linha na tabela com CLOB vazio, E guardo o ponteiro para esse CLOB, usarei no LOAD …
      16 insert into TB_TESTE_CLOB (C1, C2) values (1, empty_clob() ) returning C2 into v_lob;
      17 dbms_lob.loadclobfromfile (
      18 dest_lob => v_lob,
      19 src_bfile => l_bfile,
      20 amount => v_qtd_bytes,
      21 dest_offset => l_dest_offset,
      22 src_offset => l_src_offset,
      23 bfile_csid => l_bfile_csid ,
      24 lang_context => l_lang_context,
      25 warning => l_warning
      26 );
      27 --
      28 dbms_output.put_line('Tamanho do arquivo é:'||dbms_lob.getlength( l_bfile ));
      29 dbms_output.put_line('Bytes lidos e gravados=' ||dbms_lob.getlength(v_lob));
      30 dbms_lob.fileclose( l_bfile );
      31 commit;
      32* END;
      SCOTT@XEPDB1::CONT=XEPDB1> /
      Tamanho do arquivo é:34220
      Bytes lidos e gravados=34218

      Procedimento PL/SQL concluído com sucesso.

      SCOTT@XEPDB1::CONT=XEPDB1> exit
      Desconectado de Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
      Version 21.3.0.0.0

      C:\Users\jlchi>dir C:\app\oracle\product\21c\admin\XE\dpdump\32E2E310D29D4EC99CB01153313047B4\*TEXTO*.TXT
      O volume na unidade C é Acer
      O Número de Série do Volume é 2C56-9CDD

      Pasta de C:\app\oracle\product\21c\admin\XE\dpdump\32E2E310D29D4EC99CB01153313047B4

      03/10/2024 16:39 34.220 texto_longo.txt
      1 arquivo(s) 32.220 bytes
      0 pasta(s) 12.993.138.688 bytes disponíveis

      C:\Users\jlchi>

      Começa vendo esses pontos, okdoc ??

      #177847
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Sim, até onde sei é sim necessária  essa informação de tamanho de arquivo – então, esse trecho de :

        v_qtd_bytes := dbms_lob.getlength( l_bfile );

        ** VAI SIM ** ser usado aqui :

        17 dbms_lob.loadclobfromfile (
        18 dest_lob => v_lob,
        19 src_bfile => l_bfile,
        20 amount => v_qtd_bytes,
        ...

        Não sei SE vc não indicar o quanto ler ele VAI ou NÂO ler até o final do arquivo, mas por via das dúvidas, faça certinho, tá bem ??

        #177848
        Avatar de lucianalopeslucianalopes
        Participante

          Jose bom dia,

          Vou ver hoje em casa a noite e faco essa alteração.

          Na verdade so eu mexo na maquina, nao atuo como TI.

          Estou tentando mudar de area(voltar para TI), por isso comecei por  oracle.

          Entao o usuario do windows sou eu mesma, kkk

          Nenhuma outra pessoa tem acesso.

          O usuario do oracle meu e o sys, instalei ele assim.

          Vou alterar hoje a noite, mais uma vez muito obrigado

           

          #177849
          Avatar photoJosé Laurindo Chiappa
          Moderador

            Tá : entendo então que o usuário com o qual vc loga nesse seu Windows É administrador local dessa máquina, E vc usou ele para instalar o SGBD Oracle, né ? Tá bom, aí CERTAMENTE esse seu usuário FAZ parte do grupo ORA_DBA, vc pode fazer o teste de acesso E listar os privilégios / permissões da PASTA e do ARQUIVO logada no Windows com esse usuário mesmo – É o caso neste meu notebook pessoal, vai de boas, ok…. EU ACREDITO que o problema principal nem deve ser esse MAS sim o fato de vc ter desrespeitado um dos principais conceitos do Oracle (ie, que TODAS as strings delimitadas por aspas simples SÃO CASE SENSITIVE) se se referem à dados Internos do Oracle), penso que corrigindo isso vc deve ter sucesso…

             

            E REPITO DE NOVO, Atenção no que eu disse sobre o arquivo em si, além das permissões  : para LOADCLOBFROMFILE funfar, o arquivo TEM que ser um arquivo TEXTO, absolutamente SEM BINÁRIOS NO MEIO, e Preferencialmente com quebra de linhas NO FORMATO WINDOWS, já que vc está rodando sob Windows teu database Oracle…

             

            #177850
            Avatar de lucianalopeslucianalopes
            Participante

              Boa tarde Jose,

               

              Sim nao sabia que existia diferenca case sensitive no oracle sobre aspas simples e duplas, aprendendo e vivendo,kk.

              E outra estou comecando a fazer curso de DBA, para entender essas permissoes do oracle, mas tive que dar uma parada  por causa que estou estudando para concurso publico.

               

              Atenciosamente,

              Luciana

              #177855
              Avatar photoJosé Laurindo Chiappa
              Moderador

                Yep… Esse ponto de sensibilidade à case é UM dos conceitos fundamentais e que às vezes divergem de outros SGBDs , cruciais para qualquer um que for programar, administrar ou exportar/importar dados de/para um database Oracle.. Alguns outros :

                a) num database Oracle, quando vc Cria o database é que vc indica o CHARACTERSET (conjunto de caracteres) para strings, e daí para diante é para ESSE conjunto de caracteres que as suas strings vão ser convertidas

                b) quando o database Oracle que vc quer acessar está numa máquina remota (a situação COMUM em qquer Empresa), desde que a sua máquina pessoal TENHA acesso por rede à máquina do database, vc até pode fazer acesso direto ao database Oracle a partir de uma tool que implemente isso (por exemplo, tools escritas na linguagem Java tipicamente implementam isso via driver JDBC do tipo Thin,o Oracle SQL Developer e o Oracle SQLcl são exemplos, mas várias outras existem), mas VIA DE REGRA, a maioria das tools e das linguagens de programação usam um software extra chamado Oracle Client, que deve estar instalado na sua máquina… Não é o seu caso NESTE MOMENTO mas tenha em mente

                c) não há formato de data / hora interno no database Oracle : internamente, os dados do tipo DATE (que já incluem uma porção TIME) ou TIMESTAMP são sempre gravados com a informação de data/hora, fração de segundo (para timestamp) e timezone (para TIMESTAMP WITH TIME ZONE) e via parâmetros de sessão OU variáveis de ambiente controlamos a Exibição deles

                d) o Oracle NECESSARIAMENTE leva à ferro e fogo a questão de Integridade Transacional dos dados : assim nunca, absolutamente NUNCA, há no Oracle leitura “suja” de dados, ie, de forma alguma uma sessão vai conseguir ler dados que outra sessão introduziu/alterou MAS não comitou, ie, não EFETIVOU a Transação…

                e) tal como QUALQUER OUTRO SGBD RELACIONAL, num database controlado pelo software SGBD Oracle vc só consegue acessar e manipular dados via linguagens SQL ou PL/SQL, sejam dados de usuário, sejam dados do funcionamento Interno do database – então, seja vc Programadora, Analista de Sistemas, Engenheira de Dados , DBA, etc, vc TEM que estudar e conhecer ambas as linguagens

                f) não é Obrigatório, mas eu RECOMENDO FORTEMENTE que vc conheça E use múltiplas tools cliente : vc disse que hoje já usa Oracle SQL DEVELOPER, recomendo estudar/testar/conhecer/usar um pouco Outras, pode ser por exemplo o SQLPLUS, que já vem instalado junto com o software SGBD ORACLE

                Lógico, tem MUITAS COISAS MAIS que vc precisa conhecer, mas estas são algumas que me vêm à cabeça de momento, blz ? E claro, cfrme vc for progredindo, vai perguntando qquer dúvida que tenha, que a gente tenta te ajudar, blz ?

                Abraços,

                Chiappa

                #177858
                Avatar de lucianalopeslucianalopes
                Participante

                  Boa Noite Jose,

                  Alterei o codigo conforme conversamos, pus o nome em maisculo o nome do arquivo, pus no codigo o erro persiste.

                  Desisto disso.

                   

                  declare
                  l_clob clob;
                  v_src_offset number:=1;
                  v_dest_offset number:=1;
                  l_lang_context number := dbms_lob.default_lang_ctx;
                  v_inicio number:=1;
                  l_warning number;
                  vTamanho_Texto number;
                  pasta bfile;
                  begin
                  pasta:=bfilename(‘TESTETD’,’teste.txt’);
                  vTamanho_Texto:=dbms_lob.getlength(pasta);
                  dbms_lob.fileopen(pasta,dbms_lob.lob_readonly);
                  vTamanho_Texto:=dbms_lob.getlength(pasta);
                  insert into testeclobxml1(ID, NOME, ARQUIVO) VALUES(2,’teste’,EMPTY_CLOB()) returning arquivo into l_clob;commit;
                  dbms_lob.loadclobfromfile(l_clob, pasta,vTamanho_Texto,v_dest_offset,v_dest_offset,bfile_csid => dbms_lob.default_csid,
                  lang_context => l_lang_context,
                  warning => l_warning);

                  dbms_output.put_line(‘Tamanho do arquivo é:’||dbms_lob.getlength( pasta ));

                  dbms_output.put_line(‘Bytes lidos e gravados=’ ||dbms_lob.getlength(l_clob));
                  dbms_lob.fileclose(pasta);
                  end;

                   

                  Atenciosamente,

                  Luciana

                Visualizando 7 posts - 16 até 22 (de 22 do total)
                • Você deve fazer login para responder a este tópico.
                plugins premium WordPress