Q1
これは最終的にPostgres 9.4の公式ドキュメントに追加されました:
PL/pgSQL 変数への値の割り当ては、次のように記述されます。
variable { := | = } expression;
[...] =
PL/SQL準拠の代わりにequal()を使用できます:=
。
Q2
=
の代わりに使用する既知の結果はあり:=
ますか?
はい、深刻な結果を招くケースがありました:名前付きパラメーターを使用した関数呼び出し-関連していますが、まったく同じではありません。
厳密に言えば、この場合の区別はSQLコードで行われます。しかし、それは無防備なプログラマーに対する学問的な違いです。1
関数を考えてみましょう:
CREATE FUNCTION f_oracle(is_true boolean = TRUE) -- correct use of "="
RETURNS text AS
$func$
SELECT CASE $1
WHEN TRUE THEN 'That''s true.'
WHEN FALSE THEN 'That''s false.'
ELSE 'How should I know?'
END
$func$ LANGUAGE sql;
余談です=
が、関数定義での の正しい使用に注意してください。CREATE FUNCTION
これは構文の一部であり、 SQL代入のスタイルです。2
名前付き表記による関数呼び出し:
SELECT * FROM f_oracle(is_true := TRUE);
Postgres は:=
パラメーター割り当てとして識別され、すべて問題ありません。ただし:
SELECT * FROM f_oracle(is_true = TRUE);
は SQL 等値演算子であるため=
、Postgres は呼び出しステートメントのコンテキストで SQL 式として解釈し、結果を名前のない位置パラメーターis_true = TRUE
として渡す前に評価を試みます。外側のスコープで識別子を探します。それが見つからない場合:is_true
ERROR: column "is_true" does not exist
それは幸運なケースであり、幸運なことに、一般的なケースでもあります。
外側のスコープにある場合(およびデータ型に互換is_true
性がある場合) は、関数によって受け入れられる結果をis_true = TRUE
持つ有効な式です。boolean
エラーは発生しません。明らかに、これはSQL等値演算子を使用するプログラマーの意図=
です...
このSQL Fiddleはその効果を示しています。
と の違いを認識していないと、デバッグが非常に困難=
です:=
。
常に正しい演算子を使用してください。
1関数呼び出しで名前付き表記を使用する場合:=
、正しい代入演算子はだけこれは、PL/pgSQL だけでなく、pg 9.4 までのすべての言語の関数に適用されます下記参照。
2=
(またはDEFAULT
) を
使用して、関数パラメーターのデフォルト値を定義できます。それは当面の問題とはまったく関係ありません。間違ったユースケースに非常に近いです。
Postgres 9.0 - 9.4: から:=
への移行=>
名前付き関数パラメーターへの代入の SQL 標準は=>
(そしてOracle の PL/SQL はそれを使用します。Postgres は同じことができませんでした。演算子は以前に予約解除されていたため、:=
代わりに PL/pgSQL の代入演算子を使用しています。Postgres 9.0 のリリースにより、=>
を他の目的で使用することは推奨されていません。リリース ノートによると:
演算子名としての => の使用を廃止します。 (Robert Haas)
PostgreSQL の将来のバージョンでは、名前付き関数パラメータの SQL 標準表記をサポートするために、おそらくこの演算子名を完全に拒否するでしょう。現時点ではまだ許可されていますが、そのような演算子が定義されている場合は警告が発せられます。
他の目的で使用する場合は、使用=>
を中止してください。将来的に壊れます。
Postgres 9.5:=>
今すぐ使用
このリリース以降、SQL 標準演算子=>
が使用されます。:=
下位互換性のために引き続きサポートされています。ただし、非常に古いバージョンで実行する必要のない新しいコードでは、標準演算子を使用してください。
これは、変更されていないplpgsql コードの代入演算子ではなく、関数呼び出し(SQL スコープ) の名前付きパラメーターの代入に適用されます。:=