2017-05-16 4 views
1

以下は私のシェルスクリプトです。シェルスクリプトを使用してposrgresqlに列を挿入しようとしています。 しかし、以下のエラーを取得します。 スクリプト:シェルスクリプトを使用してpostgresqlに列を挿入中にエラーが発生しましたか?

i='dcm_account494401_click_2017050511_20170505_093843_556195422.csv.gz' 
    load_date='2017-05-12' 
    load_status='Fail' 
    message="INFO: Load into table 'stg_ft_raw_activity' completed, 362554 record(s) loaded successfully. 
    INFO: Load into table 'stg_ft_raw_activity' completed, 1 record(s) were loaded with replacements made for ACCEPTINVCHARS. Check 'stl_replacements' system table for details. 
    " 
    psql "host=$HOST port=$DBPORT dbname=$DBNAME user=$DBUSER password=$DBPASS" -F --no-align <<EOF 
    truncate table stg.notification_table; 
    \set fname $i 

\set load_date $load_date 
\set load_status $load_status 
\set message $message 

insert into stg.notification_table values (:'fname', :'load_date', :'load_status',:"message"); 
    EOF 

エラー:

Expanded display is used automatically. 
TRUNCATE TABLE and COMMIT TRANSACTION 
ERROR: syntax error at or near "INFO" 
LINE 1: INFO: Load into table 'stg_ft_raw_activity' completed, 1 re... 
    ^

メッセージCOLは、文字列値であり、またSPL文字が含まれています。それは理由ですか?

解決に協力してください。 Thansk、

+0

あなたは実際にPostgresqlまたはRedshiftを使用していますか?それらは関連していますが、多くの違いがあります。 – Nathan

答えて

0

\setでこれらの変数を使用する必要はありません。

message="INFO: Load into table 'stg_ft_raw_activity' completed, 362554 record(s) loaded successfully. 
INFO: Load into table 'stg_ft_raw_activity' completed, 1 record(s) were loaded with replacements made for ACCEPTINVCHARS. Check 'stl_replacements' system table for details. 
" 

psql <<EOF 
INSERT INTO message_table VALUES (\$\$$message\$\$); 
EOF 

これはないシェル変数参照はバックスラッシュでエスケープされ$徴候と、文字列リテラル用“ dollar quoting ”を使用する:ここ

は一例です。

+0

あなたの返信laurenzありがとう。はい、私たちがvmessage変数を使用し、ドル記号を使用できる文字列を入れれば正しいです。しかし、iamがログファイルから取得する場合は、同じメッセージを使用する必要があります。 例:/ set message 'cat log.txt' 同じエラーが表示されます。それを解決するにはどうすればいいですか?私が間違っていると私を訂正します。 –

+0

私は分かりません。もっと詳しく説明できますか?なぜあなたは '\ set'を必要としますか? –

+0

echo -e "今日の$ logdateの新しいDCMファイルはありません" >> $ psql_fail_log.log status = "ファイルが見つかりません" duplicate_flag = 0 psql "host = $ HOST port = $ DBPORT dbname = $ DBNAME user = $ DBUSERのパスワード= $ DBPASS」-F --no-ALIGN << EOF \セットFNAME $ I \セットload_date $ load_date \設定LOAD_STATUSの$ステータス \セットis_duplicate $ duplicate_flag メッセージ '猫の "$ psql_fail_log.log" ':' load_date '、:' load_status '、\ $ \ $$ message \ $ \ $、:' is_duplicate '); stg.notification_table値に挿入します。 EOF –

関連する問題