外部テーブルを使用してファイルからデータをロードしています。このデータには多くの処理が必要であり、外部テーブルは動的に作成されるため、データは外部テーブルにロードされ、次にグローバル一時テーブルにロードされ、次に外部テーブルが削除され、処理が行われます。一時テーブル内のデータを続行します。一時テーブルの構造は、外部テーブルの構造と一致します。
外部テーブルを削除すると、グローバル一時テーブルがクリアされます。
これはすべて同じプロセスで発生するため、セッションの問題ではないと思います。
プロシージャは次のようになります。
create or replace
PROCEDURE Upload_Data_File
(
filename IN varchar2
)
IS
can_create_table char(1) := 'Y';
ext_table_name varchar2(200) := filename;
sql_to_run varchar(5000) := '';
BEGIN
/*****************************************************************************
Create external table/load file data
*****************************************************************************/
BEGIN
ext_table_name := replace(ext_table_name, '.', '_');
ext_table_name := 'ext_' || ext_table_name;
sql_to_run := 'CREATE TABLE ' || ext_table_name || '
(
ROW1 CHAR(1 BYTE),
ROW2 CHAR(1 BYTE),
RECORD_TEXT VARCHAR2(200 BYTE),
RECORD_NUMBER NUMBER
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY FILE_DIRECTORY
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
FIELDS
(
ROW1 char(1)
,ROW2 char(1)
,record_text position(3:203)
,record_number recnum
)
)
LOCATION
(
''' || filename || '''
)
)
REJECT LIMIT UNLIMITED';
EXECUTE IMMEDIATE sql_to_run;
can_create_table := 'Y';
END;
IF can_create_table = 'Y' THEN
/***************************************************************************
To avoid the use of a lot of dynamic SQL, a single statement will move
the rows from the external table to a global temp table.
***************************************************************************/
sql_to_run := 'INSERT INTO Global_File_Upload (
ROW1,
ROW2,
record_text,
record_number
)
SELECT
ROW1,
ROW2,
record_text,
record_number
FROM ' || ext_table_name;
EXECUTE IMMEDIATE sql_to_run;
/***************************************************************************
The external table is no longer needed and can be dropped
***************************************************************************/
sql_to_run := 'DROP TABLE ' || ext_table_name;
--EXECUTE IMMEDIATE sql_to_run;
/***************************************************************************
Process the records in the temp table
***************************************************************************/
END IF;
END IF;
外部表を削除するための EXECUTE IMMEDIATE がコメント化されている限り、プロシージャは正しく実行されます。しかし、そのステートメントの実行を許可すると、一時テーブルには処理するデータがありません。