我正在通过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文件,而无需手动选择。
在大多数情况下,您将无法以纯PL / SQL方式执行此操作。这里列出了一种解决方法:使用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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句