【bat】ディレクトリ一覧とファイル一覧を取得する

コマンドプロンプトでディレクトリ一覧とファイル一覧を取得します。
パスとファイル名のみ取得できるようにオプションを追加して取得します。

  • ディレクトリ一覧取得

    /b:不要な情報を非表示(サイズや更新時間)
    /s:ディレクトリ内を再帰表示
    /ad:表示属性はディレクトリのみ(/aが属性、/dがディレクトリ)
    
    dir /b /s /ad
    
  • ファイル一覧取得

    /a-d:表示属性はファイルのみ(-をつけることでディレクトリを除く)
    
    dir /b /s /a-d
    
  • ディレクトリ一覧とファイル一覧取得

    dir /b /s
    

【Oracle】データファイルとコントロールファイルを利用したインポート

データファイルとコントロールファイルを利用して
Oracleにデータをインポートします。

  • バッチファイル
  • @echo off
    REM == バッチファイル起動ディレクトリ取得 ==
    SET BAT_PASS=%~dp0
    
    REM == データファイルパス設定 ==
    SET DATA_PASS=%BAT_PASS%\data\
    
    REM == コントロールファイルパス設定 ==
    SET CTL_PASS=%BAT_PASS%\ctl\
    
    REM == データファイル名 ==
    SET CSVEXT=.csv
    SET CTLEXT=.ctl
    SET LOGEXT=.log
    SET DATA_ANKEN_KANRI=t_anken_kanri
    
    echo ==============================
    echo 案件管理 データファイル取込
    echo ==============================
    sqlldr USERID='TESTUSR/PASSWORD@サービス名' CONTROL='%CTL_PASS%%DATA_ANKEN_KANRI%%CTLEXT%' DATA='%DATA_PASS%%DATA_ANKEN_KANRI%%CSVEXT%' LOG='%DATA_PASS%%DATA_ANKEN_KANRI%%LOGEXT%'
    
    pause
    
  • コントロールファイル
  • OPTIONS (ERRORS=0, ROWS=10000, DIRECT=TRUE)
    LOAD DATA
    INFILE './t_anken_kanri*.csv' "str '\r\n'"
    APPEND
    INTO TABLE "TESTUSR"."T_ANKEN_KANRI"
    FILEDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"' AND '"'
    DATE FORMAT "YYYY/MM/DD hh24:mi:ss"
    TRAILING NULLCOLS
    (
        項目名1
        項目名2
        項目名3
    )
    
  • データファイル
  • "aaaa","bbbb","cccc"
    

【Java】指定日付の月末月初を求める

Java8のLocalDateクラスを利用して指定日付の月末月初を求めます。

// フォーマット
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
// 月初
LocalDate ldFirst = LocalDate.parse("20181015", dtf).withDayOfMonth(1);
// 月末
LocalDate ldLast = LocalDate.parse("20181015", dtf).withDayOfMonth(1).plusMonth(1).minusDays(1);

// 文字列変換
String strFirst = dtf.format(ldFirst);
String strLast = dtf.format(ldLast);

【MySQL】トランザクション管理

MySQLのトランザクションについてのメモ。
後でまとめる。

◆REPEATABLE READ
ファントムリード
スナップショットを保持している場合、発生しない。
スナップショットを保持していない場合、発生する。

ファジーリード
スナップショットを保持している場合、発生しない。
スナップショットを保持していない場合、発生する。

◆READ COMMITTED
ファントムリード
発生する。
ファジーリード
発生する。
スナップショットを保持しない。

MySQLは「REPEATABLE READ」の場合、
「START TRANSACTION;」時点でトランザクションが開始されるわけではなく、
最初のSELECTでトランザクションが開始される。
利点でもあり、欠点でもある。

ファントムリードは追加レコードを参照してしまうこと。
ファジーリードは更新レコードの値を参照してしまうこと。

【Oracle】統計情報に関するSQL

統計情報に関するSQLのメモです。

  • テーブルの統計情報を取得

    EXEC DBMS_STATS.GATHER_TABLE_STATS('スキーマ名', 'テーブル名');
    
  • インデックスの統計情報を取得

    EXEC DBMS_STATS.GATHER_INDEX_STATS('スキーマ名', 'インデックス名');
    
  • テーブルの統計情報の状態確認

    SELECT UT.TABLE_NAME, UT.NUM_ROWS, UT.BLOCKS, UT.AVG_ROW_LEN, UT.SAMPLE_SIZE, UT.LAST_ANALYZED FROM USER_TABLES UT WHERE UT.TABLE_NAME NOT IN ('CHAINED_ROWS', 'CREATE$JAVA$LOB$TABLE', 'EXCEPTIONS', 'PLAN_TABLE', 'PROF$PLAN_TABLE') AND UT.TABLE_NAME NOT LIKE 'BIN$%' ORDER BY UT.TABLE_NAME; 
    
  • インデックスの統計情報の状態確認

    SELECT UI.TABLE_NAME, UI.INDEX_NAME, UI.NUM_ROWS, UI.SAMPLE_SIZE, UI.LAST_ANALYZED, UI.STATUS FROM USER_INDEXES UI WHERE UI.TABLE_NAME NOT IN ('CHAINED_ROWS', 'CREATE$JAVA$LOB$TABLE', 'EXCEPTIONS', 'PLAN_TABLE', 'PROF$PLAN_TABLE') AND UI.TABLE_NAME NOT LIKE 'BIN$%' ORDER BY UI.TABLE_NAME, UI.INDEX_NAME;
    

【Oracle】パスワードの有効期限

VMwareにOracle11gをインストールしているのですが、
久しぶりにsqlplusにログインしたところ以下のエラーが発生しました。

ERROR:
ORA-28002: the password will expire within 7 days

Oracle10gまではパスワードは無期限でしたが、
Oracle11gからはパスワードの有効期限があるようです。
パスワードの期限を無期限に変更し、
パスワードを再設定します。

sqlplusに管理者権限を持つユーザかsysユーザでログインします。

sqlplus sys/管理者パスワード as sysdba

以下のSQLを実行します。

alter profile default limit password_life_time unlimited;
alter user ユーザ名 identified by "パスワード";

パスワードはダブルクォーテーションで括らないとエラーになります。
記号の区別がつかないためと思われます。

【SQLServer】データのエクスポートとインポート

データのエクスポートとインポートをBCPユーティリティを利用して行います。

bcp データベース名.所有者(初期はdbo).テーブル名 in|out|queryout|format ファイル名 オプション
bcp Test_db.dbo.TestTbl out TestTbl.txt /U ユーザ名 /S サーバ名 /P パスワード /c /t , /r \r\n /q >> exec.log
/c /cを指定しない場合、列ごとにプロンプトでタブや改行を指定する必要がある。
/t /cを指定した場合、デフォルトはタブ区切りになる。変更する場合に指定。
/r /cを指定した場合、デフォルトは\nになる。変更する場合に指定。
/q 空白や単一引用符を含むデータベース名、所有者、テーブル名を指定する場合に指定。
/o bcpコマンド単位でログ出力できる。「>> ファイル名」の方が楽。
/f フォーマット個別指定。/cの方が楽。
   以下がフォーマット。
   8.0
   2
   1 SQLCHAR     0 3 "," 1 USERID Japanese_BIN
   2 SQLDATETIME 0 8 "," 2 DATE   ""

   1行目:バージョン番号
   2行目:列数
   3行目:番号、データ型、プレフィックス長、項目長、終端文字、DB内の項目番号、DB内の項目名、行の照合順序(※1)

※1
照合順序の例
 Japanese_BIN
  大文字、小文字、シングルバイト、ダブルバイト、ひらがな、カタカナを全て区別する
 Japanese_CI_AS
  大文字、小文字、シングルバイト、ダブルバイト、ひらがな、カタカナを全て区別しない

複数テーブルに対して作成する場合、
以下のようなSQL文を準備しておくと汎用性が高くなる。

SELECT 'bcp Test_db.dbo.' + name + ' out ' + name + '.txt /U ユーザ名 /S サーバ名 /P パスワード /c /t "," /r \r\n' FROM sysobjects WHERE type = 'U' ORDER BY name;

【Git】Git導入

今更ながらGitを導入。
最新版のポータブル版を利用します。(現時点では2.15)

  • Git入手
    https://github.com/git-for-windows/git/releases/latest
    PortableGit-X.XX.X-64-bit.7z.exe
  • Git導入
    ダウンロードした7-Zip の 自己解凍ウィザードを起動する。
    任意の場所(今回はD:/DownloadFiles/Git)を指定し、インストールします。
    インストール後、警告が出ましたが、無視。
    ダウンロードしたGit-X.XX.X-64-bit.exeとPortableGit-X.XX.X-64-bit.7z.exeは削除。
  • 環境変数の設定
    環境変数のPathに「D:\DownloadFiles\Git\cmd;」を追加します。
  • 日本語設定
    /// 下記は実施しませんでした。 //////////////////////////////////////

    nkf32.exeを入手します。(nkfwin32.exeは32bit版、nkf.exeは64bit版)
    nkf.exeにリネームし「D:\DownloadFiles\Git\bin」に配置します。

    「D:\DownloadFiles\Git\etc\inputrc」を以下のように編集します。

    set input-meta on
    set output-meta on
    set convert-meta off
    set kanji-code utf-8
    

    「D:\DownloadFiles\Git\etc\profile」の末尾に以下を追加します。

    export GIT_PAGER="nkf -s | LESSCHARSET=utf-8 less"
    export GIT_EDITOR="'D:\DownloadFiles\sakura\sakura.exe' -CODE=4"
    

    /// 上記は実施しませんでした。 //////////////////////////////////////

  • gitconfigの設定
    コマンドプロントを立ち上げ、以下を入力します。

    git config --global core.autocrlf false
    git config --global core.excludesfile ~/.gitignore
    git config --global user.name [ユーザー名]
    git config --global user.email [メールアドレス] 
    git config --global credential.helper wincred
    

    上から順に
    ・改行コードをエディタで明示するので変換なし
    ・全体の .gitignore ファイルの指定
    ・GitHubのユーザ名
    ・GitHubのパスワード
    ・HTTPS で クローンする際にクレデンシャル情報を記憶

    設定値は「C:/Users/XXXX/.gitconfig」に保存されます。

  • gitignoreの設定
    全体設定を「.gitignore」ファイルに行います。
    コマンドプロントに以下を入力します。

    type nul > %USERPROFILE%\.gitignore
    

    Linuxでいうところのtouchコマンドの代わりで0KBのファイルが出来ます。
    「.gitigonore」ファイルにはGitで管理しないファイルを追記します。
    以下を設定しました。(改行コードはLFにしました。)

    # Eclipse
    .metadata
    bin/
    tmp/
    *.tmp
    *.bak
    *.swp
    *~.nib
    local.properties
    .settings/
    .loadpath
    .recommenders
    # External tool builders
    .externalToolBuilders/
    # Locally stored "Eclipse launch configurations"
    *.launch
    # PyDev specific (Python IDE for Eclipse)
    *.pydevproject
    # CDT-specific (C/C++ Development Tooling)
    .cproject
    # Java annotation processor (APT)
    .factorypath
    # PDT-specific (PHP Development Tools)
    .buildpath
    # sbteclipse plugin
    .target
    # Tern plugin
    .tern-project
    # TeXlipse plugin
    .texlipse
    # STS (Spring Tool Suite)
    .springBeans
    # Code Recommenders
    .recommenders/
    # Scala IDE specific (Scala & Java development for Eclipse)
    .cache-main
    .scala_dependencies
    .worksheet
    
  • Eclipseの設定
    EclipseからGitリポジトリを見るため、環境変数に以下を追加します。
    HOME=C:/Users/XXXX

大量の特定ファイルを処理

特定ファイルを処理する場合、
lsやfindした結果をパイプで繋いで処理しますが、
特定ファイルが大量に存在する場合のメモ。

# パターンその1
# ファイルが多すぎるとエラーになる
ls *.txt | xargs rm
# パターンその2
# ファイルが多すぎるとエラーになる
find -f *.txt | xargs rm
# パターンその3
# ファイルが多すぎ手も処理できるがメモリを消費
echo *.txt | xargs rm

【Oracle】これまでに実行したSQL一覧とCPU時間

これまでに実行したSQL一覧とCPU時間を統計データが格納されたビューから取得します。

SELECT SQL_TEXT, FETCHES, EXCUTIONS, LOADS, ELAPSED_TIME, CPU_TIME FROM V$SQL_STATS WHERE SQL_ID = 'xxxxxx';

SQL_TEXT:SQL文
FETCHES:フェッチを行った回数
LOADS:オブジェクトのロード回数
ELAPSED_TIME:SQL の実行に使用した累計の時間
CPU_TIME:SQL の実行に使用した累計の CPU 時間