我通过SQL * Loader将文本文件导入Oracle表,但我不想提供文件的特定名称,我只想导入.txt文件扩展名文件。 看下面的代码:
create or replace
PROCEDURE EXT_TABLE
AS
A1 NUMBER ;
L_QUERY VARCHAR2(1000) := NULL;
L_DROP VARCHAR2(10000) := NULL;
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE IMPORT_TEST
( EMP_ID NUMBER (10)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY IMPORT
ACCESS PARAMETERS
( RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY '',''
MISSING FIELD VALUES ARE NULL
)
LOCATION ('file with .txt extension')
)reject limit unlimited';
L_QUERY:= 'INSERT INTO MPRN SELECT * FROM IMPORT_TEST';
EXECUTE IMMEDIATE L_QUERY;
L_DROP := 'drop table IMPORT_TEST ';
execute immediate L_DROP;
--execute immediate 'DROP IMPORT_TEST';
commit;
END EXT_TABLE;
在该位置LOCATION ('file with .txt extension')
,我不想在目录中提供文件的名称,只有一个txt文件存在。我不想使用IN
参数。我想只从目录中搜索。用户将运行该过程,它将自动导入txt文件,而无需手动选择。
答案 0 :(得分:2)
在大多数情况下,您无法以纯PL / SQL方式执行此操作。此处列出了一种解决方法:Listing files in a specified directory using PL/SQL但考虑到SYS的要求可能并不完全符合您的要求。之后,Java存储过程将是您最好的选择。
如果您能够确定文件名,则可以使用执行立即调用即时重新定义外部表的位置。您可以将它放在这样的过程中并在查询外部表之前使用它:
procedure alterExtTableFileName(a_tableName varchar2, a_filename varchar2) is
pragma autonomous_transaction;
begin
dbms_output.put_line('alterExtTableFileName(TableName=' || a_tableName || ' FileName=' || a_filename || ')');
execute immediate 'alter table ' || a_tableName || ' LOCATION (''' || a_filename || ''')';
commit;
exception when others then
rollback;
raise;
end alterExtTableFileName;