如何使用"喜欢"命令在下面的查询中

时间:2014-10-03 09:25:54

标签: oracle plsql external-tables

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

1 个答案:

答案 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;