Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Importando arquivos no Oracle Apex usando wwv_flow_files

Suponha que você queira importar um conteúdo de arquivo csv com procedimento de banco de dados personalizado no Oracle Apex usando o item de página de navegação de arquivo. Siga estas etapas:Crie o item da página de navegação do arquivo no Apex e escolha a opção wwv_flow_files para armazenar o arquivo. Em seguida, crie o processo da página e escolha após o envio e execução da opção de validação e a opção de código plsql para o processo. Na área plsql, escreva o seguinte código para exportar o arquivo csv do banco de dados (visualização wwv_flow_files) para a unidade do servidor e, em seguida, chame seu procedimento personalizado para importar o conteúdo desse arquivo para uma tabela.DECLARE
v_upl_blob BLOB;
vstart Number :=1;
bytelen Number :=32000;
len Number;
my_vr Raw (32000);
x Number;
l_output Utl_file.file_type;
erout varchar2(1000);
BEGIN
SELECT blob_content
INTO v_upl_blob
FROM wwv_flow_files
WHERE name =:P25_FB;
-- :p25_fb é o item de navegação do arquivo na página
LEN :=Dbms_lob.getlength(V_UPL_BLOB);
l_output :=Utl_File.fopen ('MY_FILES', :P25_FB, 'wb', 32760);
vstart :=1;
bytelen :=32000;
IF len <32760
Então
Utl_File.put_raw (l_output, V_UPL_BLOB);
Utl_File.fflush (l_output);
Else -- escreva em pedaços
vstart :=1;

WHILE vstart 0
LOOP
Dbms_lob.Read (V_UPL_BLOB, bytelen, vstart, my_vr);
Utl_File.put_raw (l_output, my_vr);
Utl_File.fflush (l_output);
-- define a posição inicial para o próximo corte
vstart :=vstart + bytelen;
-- define a posição final se for menor que 32000 bytes
x :=x - bytelen;

SE x <32000
Então
bytelen :=x;
FIM SE;
FIM LOOP;
FIM SE;

Utl_File.fclose (l_output);

DELETE FROM wwv_flow_files
WHERE name =:P25_FB;
COMMIT;
--- chame seu procedimento de banco de dados personalizado para importar...
yourcustomprocedure(:P25_FB);
EXCEÇÃO Quando Outros
Então
IF Utl_File.is_Open(l_output) Então
Utl_File.fclose (L_OUTPUT);
END IF;
raise;
END;