2019年8月21日水曜日

Oracle SQL*Plus。MinGW32は癖がある (笑)

Oracle SQL*Plusを使うなんて20年ぶり
Windows環境で実行させて、結果をLinux環境に送り別の処理をする。

例えば、前日に新規登録されたデータだけを、翌日に抽出する場合。
Linux環境では、localtime_rで比較的簡単に日付指定の文字列を作れる。
ところが、Windows環境のMinGWは基本的にWindowsに依存しているので、
同じgccを使っても、localtime*は使用できない。
gccでも、違うんだぁ

Msys MinGWは、その環境で作った実行モジュールをWindowsのコマンドプロンプトで実行できない。
それをするなら、MinGWだけをインストールする必要がある。
MinGW | Minimalist GNU for Windows

でも、MinGWはWindowsに依存しているのでLinuxとの違いが発生する。
多分、今回のlocaltime*だけだと思うけど、、、

まぁ、やるといろいろ起こります。勉強勉強

で、今回のソースをドーンと

Peace!!


SQL*Plusを起動するバッチ

@ECHO OFF
:START
ECHO ---------------------------------------------------
ECHO 前日新規に登録された品目情報を出力します。
ECHO ---------------------------------------------------
CD %~dp0
DEL hinsabun.csv
hinsabun.exe > hinsabun.sql
@ECHO SQLを実行中です。しばらくお待ち下さい..
@ECHO -------------------------------
sqlplus /nolog @"hinsabun.sql" USER PASSWORD 192.168.XXX.XXX/ORCL
@ECHO -------------------------------
@ECHO 完了しました。
EXIT

localtime_r を使わない処理

#include <stdio.h>
#include <string.h>
#include <time.h>

#define PRS(A)  printf("%s\n", A)
char    *mn[]= {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

int main(int argc, char* argv[]){
    char    szTime[15];
    char    szBuf[256], szBuf1[64];
    char    szMn[4], szDmy[10];
    int     n = 1, iDay, i, iMn, iYr;
    struct tm tm;
    time_t t;
    
    time(&t);
    t -= (86400 * n);
    strcpy(szBuf1, ctime(&t));
    strcpy(szDmy, strtok(szBuf1, " "));
    strcpy(szMn, strtok(NULL, " "));
    iDay = atoi(strtok(NULL, " "));
    strcpy(szDmy, strtok(NULL, " "));
    iYr = atoi(strtok(NULL, " "));
    for (i = 0; i < 12; i++) {
        if (strcmp(szMn, mn[i]) == 0){
            iMn = i + 1;
            break;
        }
    }
    sprintf(szTime, "%04d%02d%02d", iYr, iMn, iDay);

    //localtime_r(&t, &tm);
    //sprintf(szTime, "%04d%02d%02d%02d%02d%02d",
    //        tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
    //        tm.tm_hour, tm.tm_min, tm.tm_sec);
    //sprintf(szTime, "%04d%02d%02d",
    //          tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
    
    PRS("connect &&1/&&2@&&3");
    PRS("spool off");
    PRS("set echo off");
    PRS("set heading off");
    PRS("set termout off");
    PRS("set pause off");
    PRS("set pagesize 0");
    PRS("set linesize 10000");
    PRS("--set trimout on");
    PRS("set trimspool on");
    PRS("set feedback off");
    PRS("set verify off");
    PRS("set colsep '|'");
    PRS("spool hinsabun.csv");
    sprintf(szBuf, "SELECT ITEM_CD, ITEM_DIV, ITEM_NAME1, ITEM_NAME2, STD_UNIT, STD_UNITPRICE, UNIT2, UNIT_CONV_RATE,ITEM_NAME4,REGIST_DATE, UPDATE_DATE from DFW_M040M where REGIST_DATE >= to_date('%s', 'yyyymmdd');", szTime);
    PRS(szBuf);
    PRS("spool off");
    PRS("exit");
    
    return 0;
}

Peace!!

0 件のコメント:

コメントを投稿