sql >> データベース >  >> RDS >> Oracle

46SQLローダーの制御ファイル

    これは古い質問ですが、それでも関連する質問です。将来の検索者のために、テーブルのスケルトン制御ファイルを生成するユーティリティパッケージに追加したプロシージャを次に示します。テーブル名を渡すと、必要に応じて微調整できるデフォルトの制御ファイルが出力されます。最初にニーズに合わせて編集する必要があるかもしれません。

    このように電話してください:

    set serveroutput on;
    exec utils.gen_ctl_file('TABLE_NAME');
    

    手順:

    /********************************************************************************************************
    Name:       GEN_CTL_FILE
    
    Desc:       Generates a skeleton control file from a table for loading data via SQL*Loader.
    
    Args:       tablename_in IN VARCHAR2, delim_in VARCHAR2 DEFAULT '|'
    
    Returns:    None.
    
    Usage:      utils.gen_ctl_file('tablename');
    
    Notes:      Prints a skeleton control file.
    
                If a template for a fixed-length data file is desired, use 'FIXED' for the delim_in string.
    
                Example usage:
    
                set serveroutput on;
                execute utils.gen_ctl_file('tablename');
    
    ************************************************************************************************************************/
    PROCEDURE GEN_CTL_FILE(tablename_in IN VARCHAR2, delim_in VARCHAR2 DEFAULT '|') IS
    ERRNULLTABLENAME     CONSTANT NUMBER        := -20103; -- User-defined error numbers and messages.
    ERRNULLTABLENAMEMSG  CONSTANT VARCHAR2(100) := 'A table name is required.';
    USAGE                CONSTANT VARCHAR2(100) := '*   USAGE: UTILS.GEN_CTL_FILE(tablename_in IN VARCHAR2, fieldsep_in VARCHAR2 DEFAULT ''|'')';
    v_delim                       VARCHAR2(20)  := NVL(delim_in, '|');
    err_nbr  NUMBER;
    err_msg  VARCHAR2(1000);
    
    CURSOR COL_CUR  IS
      SELECT COLUMN_NAME, 
      DECODE(COLUMN_ID, 1, ' ', ',') || RPAD(COLUMN_NAME, 32) || case upper(v_delim)
        when 'FIXED' then 'POSITION(99:99) '
        else NULL
      end|| DECODE(DATA_TYPE,
             'VARCHAR2', 'CHAR NULLIF(' || COLUMN_NAME || '=BLANKS)',
             'CHAR', 'CHAR NULLIF(' || COLUMN_NAME || '=BLANKS)',
             'FLOAT', 'DECIMAL EXTERNAL NULLIF(' || COLUMN_NAME || '=BLANKS)',
             'NUMBER', DECODE(                                                 DATA_PRECISION,
             0, 'INTEGER EXTERNAL NULLIF (' || COLUMN_NAME || '=BLANKS)',
             DECODE(DATA_SCALE, 0, 'INTEGER EXTERNAL NULLIF (' || COLUMN_NAME || '=BLANKS)', 'DECIMAL EXTERNAL NULLIF (' || COLUMN_NAME || '=BLANKS)')),
             'DATE', 'DATE "MM/DD/YYYY" NULLIF (' || COLUMN_NAME || '=BLANKS)',
             data_type)
               AS COL_DATA
      FROM  USER_TAB_COLUMNS
      WHERE TABLE_NAME = UPPER(tablename_in)
      ORDER BY COLUMN_ID;
    
    BEGIN
    
    IF tablename_in IS NULL THEN
      RAISE_APPLICATION_ERROR(ERRNULLTABLENAME, ERRNULLTABLENAMEMSG || CHR(10) || USAGE);
    END IF;
    
    DBMS_OUTPUT.PUT_LINE('--');
    DBMS_OUTPUT.PUT_LINE('-- NOTE - When using DIRECT=TRUE to perform block inserts to a table,');
    DBMS_OUTPUT.PUT_LINE('--        the table''s triggers will not be used! Plan accordingly to');
    DBMS_OUTPUT.PUT_LINE('--        manually perform the trigger actions after loading, if needed.');
    DBMS_OUTPUT.PUT_LINE('--');
    DBMS_OUTPUT.PUT_LINE('OPTIONS (DIRECT=TRUE)');
    DBMS_OUTPUT.PUT_LINE('UNRECOVERABLE');
    DBMS_OUTPUT.PUT_LINE('LOAD DATA');
    DBMS_OUTPUT.PUT_LINE('APPEND');
    DBMS_OUTPUT.PUT_LINE('INTO TABLE ' || UPPER(tablename_in));
    DBMS_OUTPUT.PUT_LINE('EVALUATE CHECK_CONSTRAINTS');
    if upper(v_delim) != 'FIXED' then
      DBMS_OUTPUT.PUT_LINE('FIELDS TERMINATED BY ''' || v_delim || ''' TRAILING NULLCOLS');
    end if;
    DBMS_OUTPUT.PUT_LINE('(');
    
    -- The cursor for loop construct implicitly opens and closes the cursor.
    FOR COL IN COL_CUR
    LOOP
      DBMS_OUTPUT.PUT_LINE(COL.COL_DATA);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(')' || CHR(10));
    
    EXCEPTION
    WHEN OTHERS THEN
      err_nbr  := SQLCODE;
      err_msg  := SUBSTR(SQLERRM, 1, 1000);
      -- if any error occurs, print the SQLCODE message.
      DBMS_OUTPUT.PUT_LINE('ERROR: ' || err_nbr || ' occurred: ' || err_msg);
    END; -- GEN_CTL_FILE
    


    1. SQL Server(T-SQL)のデータベースメールプロファイルのリストを返す

    2. Oracle SQL Developer3.1.07listaggを使用した文字間の余分なスペース

    3. 他のビューで使用される列のタイプを変更する

    4. Oracleでの結合を使用した更新ステートメントの何が問題になっていますか?