Marcado: CLOB. PL/SQL
- Este tópico contém 21 respostas, 3 vozes e foi atualizado pela última vez 1 dia, 12 horas atrás por lucianalopes.
-
AutorPosts
-
4 de outubro de 2024 às 10:52 am #177846José Laurindo ChiappaModerador
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 ??
4 de outubro de 2024 às 11:03 am #177847José Laurindo ChiappaModeradorSim, 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 ??
4 de outubro de 2024 às 11:32 am #177848lucianalopesParticipanteJose 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
4 de outubro de 2024 às 11:55 am #177849José Laurindo ChiappaModeradorTá : 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…
4 de outubro de 2024 às 12:12 pm #177850lucianalopesParticipanteBoa 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
4 de outubro de 2024 às 8:11 pm #177855José Laurindo ChiappaModeradorYep… 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
4 de outubro de 2024 às 8:38 pm #177858lucianalopesParticipanteBoa 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
-
AutorPosts
- Você deve fazer login para responder a este tópico.