?
プレースホルダーを使用するスクリプトには、多少詳細なクエリがあります。この同じクエリをpsqlコマンドライン(スクリプトの外部)から直接テストしたかったのです。すべての?
を実際の値で置き換えないようにしたいので、代わりにクエリの後に引数を渡したいです。
例:
SELECT *
FROM foobar
WHERE foo = ?
AND bar = ?
OR baz = ? ;
次のようなものを探しています:
%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };
-v構文を使用できます(例:
psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'"
そして、sqlの変数を:v1、:v2などとして参照します
select * from table_1 where id = :v1;
2つの引用符を使用して文字列/日付値を渡す方法に注意してください" '...' "
PostgreSQLで発見された PREPARE
ステートメント は、スクリプト言語でできるようにできます。残念ながら、?
はまだ使用できませんが、$n
表記は使用できます。
PREPARE foo(text,text,text) AS
SELECT *
FROM foobar
WHERE foo = $1
AND bar = $2
OR baz = $3 ;
EXECUTE foo('foo','bar','baz');
DEALLOCATE foo;
Psqlには、
\set name val
-v name=val
コマンドラインオプションに関連付けられることになっているコマンド。引用は苦痛です。ほとんどの場合、クエリ全体をシェルのヒアドキュメントに入れる方が簡単です。
おっと、私は-v
(フォーマットオプション用)の代わりに-P
と言っておくべきだった。
Psqlコマンドラインまたはバッチファイルからパラメーターを渡すこともできます。最初のステートメントは、データベースに接続するために必要な詳細を収集します。
最後のプロンプトは、WHERE列のIN()句で使用される制約値を要求します。文字列の場合は単一引用符で、コンマで区切ることを忘れないでください:
@echo off
echo "Test for Passing Params to PGSQL"
SET server=localhost
SET /P server="Server [%server%]: "
SET database=amedatamodel
SET /P database="Database [%database%]: "
SET port=5432
SET /P port="Port [%port%]: "
SET username=postgres
SET /P username="Username [%username%]: "
SET /P bunos="Enter multiple constraint values for IN clause [%constraints%]: "
ECHO you typed %constraints%
PAUSE
REM pause
"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h %server% -U %username% -d %database% -p %port% -e -v v1=%constraints% -f test.sql
ここで、SQLコードファイルで、WHERE句内、またはSQLの任意の場所にv1トークンを追加します。トークンは、ファイルだけでなく、開いているSQLステートメントでも使用できることに注意してください。これをtest.sqlとして保存します。
SELECT * FROM myTable
WHERE NOT someColumn IN (:v1);
Windowsでは、ファイル全体をDOS BATchファイル(.bat)として保存し、test.sqlを同じディレクトリに保存して、バッチファイルを起動します。
EnterpriseDBのDave Pageに、元のプロンプトスクリプトをありがとう。
あなたが尋ねることは、 コマンドラインから直接行うことはできません と思われます。 plpgsqlでユーザー定義関数を使用するか、スクリプト言語からクエリを呼び出す必要があります(後者のアプローチにより、SQLインジェクションを回避するのが少し簡単になります)。