2017-11-15 11 views
-1

UNIXスクリプトからSQLファイルにパラメータを渡すことを検討しています。残念ながらそれに問題があります。UNIXスクリプトからSQLファイルにパラメータを渡す方法は?

以下のUNIXスクリプトを参照してください:私のUNIXスクリプトを実行しているとき、私は受け付けており、エラーがある

SELECT DISTINCT v1.* 
FROM data_latest v1 
JOIN temp_table t 
ON v1.number = t.id 
WHERE v1.code = '&1' 

INGRES TERMINAL MONITOR Copyright 2008 Ingres Corporation 
E_US0022 Either the flag format or one of the flags is incorrect, 
    or the parameters are not in proper order. 

#!/bin/ksh 
############ 

# Functions 
_usage() { 
SCRIPT_NAME=XXX 
    -eq 1 -o "$1" = "" -o "$1" = help -o "$1" = Help -o "$1" = HELP ]; then 
    echo "Usage: $SCRIPT_NAME [ cCode ]" 
    echo " - For example : $SCRIPT_NAME GH\n" 
    exit 1 
fi 
} 

_initialise() { 
cCode=$1 
echo $cCode 
} 

# Set Variables 
_usage [email protected] 
_initialise $1 

# Main Processing 
sql $DBNAME < test.sql $cCode > $PVNUM_LOGFILE 
RETCODE=$? 
# Check for errors within log file 
if [[ $RETCODE != 0 ]] || grep 'E_' $PVNUM_LOGFILE 
    then 
    echo "Error - 50 - running test.sql. Please see $PVNUM_LOGFILE" 
    exit 50 
fi 

は、SQLスクリプト(test.sql内)を参照してください

誰でも私が間違っていることを知っていますか?

ありがとうございます!

+0

のように、スクリプト自体にSQLでコーディングする傾向がありますエラーメッセージ-E-US0022) – mathB

+0

@mathBリダイレクトシンボル( "<")がSQL行で使用されています。次の「sql $ DBNAME $ PVNUM_LOGFILE」を参照してください。それが問題なのかどうかわからないのですか? – TCP

+0

私はエラーに慣れていません、正しい形式でパラメータを渡していますか? 'sed '/ VaLuE/$ cCode /'/'を実行する前に、' test.sql'というSQLファイルで ''&1''を' 'VaLuE''に変更してからsqlを実行してください。 full/path/to/test.sql'を実行し、メインプロセスで '$ cCode'を削除してSQLファイルをそのまま送ります。 – mathB

答えて

0

注:私はsqlコマンドでは動作しませんがisqlコマンドラインツールを使用しているとき、私は日常SQLテンプレート/スクリプトファイルにUNIXのパラメータを渡すんので、FWIW ...

最初ます&1文字列をcCode変数の値に置き換えます。 1つの典型的な方法は例えば、グローバルな検索を行うと、${cCode}&1の交換するsedを使用することです:

$ cCode=XYZ 
$ sed "s/\&1/${cCode}/g" test.sql 

SELECT DISTINCT v1.* 
FROM data_latest v1 
JOIN temp_table t 
ON v1.number = t.id 
WHERE v1.code = 'XYZ' <=== &1 replaced with XYZ 

は注:cCode変数の値となるよう、二重引用符でsedコードをラップする必要があります参照することができます。これはsqlに渡されるようになりました

、カップルのオプションがある...新しいファイルにsed出力をキャプチャし、sqlまたは...に、そのファイルを提出する[と私はこれがsqlでなんとかです推測しています] 、パイプsqlsed出力、例えば:

sed "s/\&1/${cCode}/g" test.sql | sql $DBNAME > $PVNUM_LOGFILE 
0

あなたはテキストファイルで、あなたのSQL周りの '\ Pの\ G' を必要とするかもしれ?

私は個人的に(https://communities.actian.com/s/article/COPYDB-fails-with- [これをチェック]

#!/bin/ksh 

var=01.01.2018 
db=database_name 
OUTLOG=/path/log.txt 

sql $db <<_END_ > $OUTLOG 
    set autocommit on; 
    \p\g 
    set lockmode session where readlock = nolock; 
    \p\g 
    SELECT * 
    FROM table 
    WHERE date > '${var}' ; 
    \p\g 
_END_ 

exit 0 
関連する問題