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

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

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

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

1回答

2779閲覧

シェルスクリプトからsqlplusへピリオド付き値を渡す方法

narito

総合スコア0

Oracle

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2020/10/06 10:29

編集2020/10/08 01:38

前提・実現したいこと

シェルスクリプトを使用してファイルサーバーとDBサーバーの整合性の確認ツールを作成しております。
・ファイルのパス一覧csvをファイルサーバーより取得
・取得したcsvファイルをシェルスクリプトのwhilereadで1行づつ読み出しsqlの引数に渡し、sqlでDBのSELECTを行う
上記のようなプログラムを作成しているのですが、sql側で「.」が変数の終了文字となっている為、拡張子がいらない部分と判断されエラーとなっております。

「.」付きの値を渡す方法はあるのでしょうか。

#エラーメッセージ

path = 123456789.pdf * ERROR at line 6: ORA-00933: SQL command not properly ended

#現在行った対応
・引数で渡すファイルの「.」の前に¥を配置し、sql側でSET ESCAPE ¥ を記載
・sql側でSET BLOCKTERMINATOR OFF

#ファイル内容
・fileList.csv ※イメージ

1111 /***/***/***/123456789.pdf 1111 /***/***/***/234567890.pdf

・check.sh

#!/bin/bash readonly SQLNAME="check.sql" cat fileList.csv | while read line do file_name=`echo $line | grep '^[0-9]' | cut -d '/' -f5` if [ -n "$file_name" ]; then sqlplus -s ***/*** << EOF @${SQLNAME} ${file_name} EOF fi done

・check.sql

SET LINESIZE 10000 SET PAGESIZE 0 SET FEEDBACK OFF SET TAB OFF SET VERIFY OFF select path from target where filename = &1; EXIT; /

・実行コマンド

sh check.sh

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

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

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

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

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

Orlofsky

2020/10/06 10:44

質問を実際に実行できる内容に修正してください。
narito

2020/10/06 11:06

実際に実行している内容に修正致しました。
Daregada

2020/10/06 11:26

fileList.csvの内容も実際には「*」じゃなくて先頭に数字が書いてあるのでは? じゃないと、途中のgrepで何も引っかからなくなるし、その前のechoで「*」が展開されてしまう。
narito

2020/10/06 11:45

失礼致しました。 csvの先頭はpdfファイルのバイト数です。 適当な値でとりあえずアスタを代入しておりました。
Daregada

2020/10/06 11:48

「引数で渡すファイルの「.」の前に¥を配置し」という処理が書いてないようですが。
narito

2020/10/06 12:11

うまく動作しなかったため対応する前のソースを記載しておりました file_name=echo $line | grep '^[0-9]' | cut -d '/' -f5 ↓ file_name=echo $line | grep '^[0-9]' | cut -d '/' -f5 | sed -e ‘s/¥.pdf$/¥¥¥¥¥.pdf/g‘
Daregada

2020/10/06 12:19

え、そこに入れてしまうと、その後の「if [ -n "$file_name" ]; then」のテストに失敗するのでは。
narito

2020/10/06 14:57

返信遅れましてすいません file_nameの変数の中には「123456789¥.pdf」のような形式で値が入り、記載して頂いたif文はnull判定をしているだけなので中の処理は通る事は通ります。
guest

回答1

0

自己解決

sql文を書き換える事で動作しました。
【修正前】
select path from target where filename = &1;
【修正後】
select path from target where filename = to_char('&1');

ご意見頂いた方々、ありがとうございました。

投稿2020/10/08 04:01

narito

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問