■ はじめに
AWS Redshift を psql コマンドでファイル実行しようと思っていて その際に、Hive の変数(以下の関連記事を参照)のように渡したい。
https://dk521123.hatenablog.com/entry/2021/06/24/094254
その第一段階として、Redshiftの元となっている PostgreSQL で 色々と試してみた。
目次
【1】方法 【2】使用上の注意 1)引数が複数ある場合、それぞれに「-v」を付加する 2)データ側が数字以外の場合、囲い文字を意識する 【3】サンプル 例1:受け取った値をINSERTする 例2:受け取った値を連結したテーブル名をSELECTする
【1】方法
* psql 側は、「-v <変数名>="<値>"」で渡す * ファイル側は、「:<変数名>」で受け取る
【2】使用上の注意
1)引数が複数ある場合、それぞれに「-v」を付加する 2)データ側が数字以外の場合、囲い文字を意識する
1)引数が複数ある場合、それぞれに「-v」を付加する
引数が複数ある場合、 ~~~~~~~~~~~ ... -v val1="XXX" -v val2="YYY" -v val3="ZZZ" ~~~~~~~~~~~ みたいな感じで、それぞれに「-v」を付加する
2)データ側が数字以外の場合、囲い文字を意識する
以下のように、囲み文字「'」を呼び出し側で付加しておく ~~~~~~~~~~~ ... -v val1="'XXX'" -v val2="'YYY'" -v val3="'ZZZ'" ~~~~~~~~~~~ ちなみに、ファイルの方に事前に、囲み文字を付加させた場合、 文字列として扱われてしまうので、呼び出し側でハンドリングする必要がある
sample.sql
INSERT INTO users VALUES(:val1, ':val2', ':val3'); /* -- 出力結果:エラー -- ERROR: "timestamp"型の入力構文が不正です: ":val3" 行 1: INSERT INTO users VALUES(31, ':val2', ':val3'); */
【3】サンプル
* 実行環境は、Windows の コマンドプロンプトで実行した
使用するテーブル
CREATE TABLE IF NOT EXISTS "users" ( "user_id" INTEGER NOT NULL, "user_name" VARCHAR(50) NOT NULL, "created_at" TIMESTAMP NULL DEFAULT 'CURRENT_TIMESTAMP', PRIMARY KEY ("user_id") );
例1:受け取った値をINSERTする
psql -U postgres -d sample_db -h localhost -f "C:\temp\sample.sql" -v val1="30" -v val2="'Kevin'" -v val3="'2021-08-02 16:40:55.175736'"
sample.sql
-- val1 - val3 を受け取る INSERT INTO users VALUES(:val1, :val2, :val3);
例2:受け取った値を連結したテーブル名をSELECTする
psql -U postgres -d sample_db -h localhost -f "C:\temp\sample2.sql" -v val1="us" -v val2="er" -v val3="s"
sample2.sql
-- val1 - val3 を受け取り、テーブル名「users」にする SELECT * FROM :val1:val2:val3; user_id | user_name | created_at ---------+-----------+---------------------------- ・・・略・・・ 30 | Kevin | 2021-08-02 16:40:55.175736 (XX 行)
関連記事
ファイルからSQL文を一括で実行するには ~pdqlコマンドの利用~
https://dk521123.hatenablog.com/entry/2014/09/11/002003
psql で 変数 / 定数を使う
https://dk521123.hatenablog.com/entry/2020/01/23/223756
よく使う pdqlコマンド
https://dk521123.hatenablog.com/entry/2020/01/10/224818
psqlでパスワードを省略する
https://dk521123.hatenablog.com/entry/2020/03/06/000000