2014-10-03 52 views
3

我正在通過SQL * Loader將文本文件導入到Oracle表中,但我不想給出文件的具體名稱,我只想導入.txt文件擴展文件。 看看下面的代碼:如何在下面的查詢中使用「like」命令

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

你會在任何時候在那個目錄中只有一個文本文件? – Mihai 2014-10-03 09:31:09

+1

如果我記得很清楚,用PL/SQL列出目錄中的文件相對困難。如果這是「一次性」的事情,也許你可以簡單地將它包裝在shell腳本中? – 2014-10-03 09:55:00

+0

@mihai yaa .only目錄中的txt文件 – y2j 2014-10-03 10:00:34

回答

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;