2

外部テーブルを使用してファイルからデータをロードしています。このデータには多くの処理が必要であり、外部テーブルは動的に作成されるため、データは外部テーブルにロードされ、次にグローバル一時テーブルにロードされ、次に外部テーブルが削除され、処理が行われます。一時テーブル内のデータを続行します。一時テーブルの構造は、外部テーブルの構造と一致します。

外部テーブルを削除すると、グローバル一時テーブルがクリアされます。

これはすべて同じプロセスで発生するため、セッションの問題ではないと思います。

プロシージャは次のようになります。

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 がコメント化されている限り、プロシージャは正しく実行されます。しかし、そのステートメントの実行を許可すると、一時テーブルには処理するデータがありません。

4

1 に答える 1