3

我正在通过 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 文件,而无需手动选择。

4

1 回答 1

2

在大多数情况下,您将无法以纯 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;
于 2015-04-30T19:23:01.163 回答