質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

2423閲覧

SQL構文の実行結果をsyslogに吐き出したい

yamato_0410

総合スコア36

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2018/09/05 05:07

編集2018/09/05 05:37

前提・実現したいこと

①:BATもしくはPowerShellをWindwosのタスクスケジューラに登録。登録したタスクで②~④を実行。
②:sqlplus文にてDB接続後、単純なselect文を実行(select top 1 * ~のような感じで1行のみ結果が出力されるような形)→結果はYYYYMMDD日付が出る。
③:出力した結果から前日日付と比較し前日日付以前(前日日付ではない)であれば「〇」をcsvに出力し
最終的にはsyslogに吐き出す。
④別のクエリ文で結果がNULLであった場合は「〇」をcsvに出力しsyslogに吐き出す。

上記の作業を自動化したいのですが可能でしょうか?
可能であれば構文をご教授頂けると幸いです。

不足している情報があるのであればご指摘ください。

宜しくお願い致します。

試しに実行してみた内容です。

BAT********

echo off
CD %~dp0

sqlplus ユーザ名/パスワード@接続文字列 @test.sql

BAT********

test.sql***
set echo off
set linesize 10000
set trimspool on
set feedback off
set colsep ','
spool C:\Users\Administrator\Desktop\0824確認分\test.csv
SELECT * FROM
(SELECT * FROM テーブル名
WHERE プラン番号 = 'PN00130030' and ファイルID = '3902'
ORDER BY 受信年月日 DESC)
WHERE ROWNUM <=1
ORDER BY 受信年月日 DESC;
spool off

quit
test.sql***

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2018/09/05 05:11

同じSQLでもデータベースによって方言が大きいですから、どのデータベースを使うのかを質問のタグで明示したり、バージョンも明記した方が適切なコメントが付き易いです。
yamato_0410

2018/09/05 05:15

無知ですみません。DBはOracleで結果をcsvに出力するところまではいけだんですが、そのあとがなかなかうまくいかず質問させて頂きました。
sysjojo

2018/09/05 05:18

Windowsでsyslogっていうのがピンとこないですが、イベントログ、というわけではないんですかね?syslogサーバーが別にあってそこに出したい、ってことですか?
yamato_0410

2018/09/05 05:21

はい。Windowsサーバでcsvに結果を出力させた後にsyslogサーバにそこに吐き出したいです。
sysjojo

2018/09/05 05:33 編集

csvに出力するところまでいけたコードを提示されては?syslogサーバに吐くところが足りないだけ、ということですよね?質問内容は編集できますので。
Orlofsky

2018/09/05 05:34 編集

[Oracle]タグを使ってください。
yamato_0410

2018/09/05 05:48 編集

すみません。もろもろ修正しました。csvに出力はできているのですが結果をそのまま出力しただけで過去日との比較後の結果が導きだせません。
guest

回答1

0

ベストアンサー

すでにcsvファイルがある、としてこちらのページが参考になるかと。(SQL実行もこのコードの中で行ってしまえばよいだけですが)
このページのスクリプトを少し加工して、こちらのページなどを参考に中身をチェックしてsyslogを送る/送らないはできそうです。

参考までに上記サイトのコードをすこし弄って、4.の別クエリで結果がNULLだったらsyslog送信、として試したコードです。

Powershell

1### 2# Start of Script 3## 4 5# Define port and target IP address 6# Random here! 7$Port = 514 8$IP = "xxx.xxx.xxx.xxx" 9$Address = [system.net.IPAddress]::Parse( $IP ) 10 11# Create IP Endpoint 12$End = New-Object System.Net.IPEndPoint $address , $port 13 14# Create Socket 15$Saddrf = [System.Net.Sockets.AddressFamily]::InterNetwork 16$Stype = [System.Net.Sockets.SocketType]::Dgram 17$Ptype = [System.Net.Sockets.ProtocolType]::UDP 18$Sock = New-Object System.Net.Sockets.Socket $saddrf , $stype , $ptype 19$Sock.TTL = 26 20 21# Connect to socket 22$sock.Connect( $end ) 23 24# Create encoded buffer 25$Message = (Get-content C:\Users\Administrator\Desktop\0824確認分\test.csv) -as [string[]] 26 27if ($Message -match "^NULL$") { 28 # Send the buffer 29 $Message += ",○" 30 $Buffer = [System.Text.Encoding]::UTF8.GetBytes($Message) 31 $Sent = $Sock.Send($Buffer) 32} else { 33echo "NOT NULL" 34} 35 36 37# End of Script

投稿2018/09/05 06:30

編集2018/09/05 06:35
sysjojo

総合スコア325

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamato_0410

2018/09/05 07:01

無知で大変申し訳ないのですが、上記回答にて記載頂いたスクリプトの内容でこちら側で変更をかけなければいけない箇所は、 $Port = 514      ←514のところだけ適宜変更。 $IP = "xxx.xxx.xxx.xxx"   ←xxx.xxx.xxx.xxxのところだけ適宜変更。(syslogサーバのIPへ) $Address = [system.net.IPAddress]::Parse( $IP ) ←ここはどこか変更する必要ありますでしょうか? のところだけという意味で合っていますでしょうか?
sysjojo

2018/09/05 07:33

適宜、というのが稼働しているsyslogサーバーのIPやポートに合わせて、という意味であればそうです。 提示したコードは一度Powershell ISEで実行して、syslogサーバにログが書けるところまでは確認しましたので、変更が必要と思う箇所を変えた後、試してみられるとよいかと思います。 コード全てを示すつもりはなかったので、3.の処理は上記コードで示してません。ファイルの中身を読んで変数にいれたり、ファイルの中身を書き換えたりするPowershellのサンプルはググればたくさん出てきますので、まずは試されたコードを示されるとよいかと。
yamato_0410

2018/09/05 07:37

何度もすみません。 $Address = [system.net.IPAddress]::Parse( $IP ) ↑ここについては変更不要という認識で合っていますでしょうか。
yamato_0410

2018/09/05 08:32

ご回答頂きありがとうございました。あとはこちらで調べて試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問