PostgreSQL 11 Beta 2を使用すると、非常にシンプルなtrading_holiday
テーブルはconfig
スキーマに作成されます:
DROP TABLE IF EXISTS config.trading_holiday;
CREATE TABLE config.trading_holiday
(
id smallint GENERATED ALWAYS AS IDENTITY NOT NULL,
holiday_date DATE,
name CHARACTER VARYING(80)
);
ALTER TABLE config.trading_holiday
ADD CONSTRAINT trading_holiday_pk
PRIMARY KEY (id);
次に、非常に単純なストアドプロシージャconfig.sp_add_holiday
は、テーブルに休日を追加するために作成されます。
CREATE OR REPLACE PROCEDURE config.sp_add_holiday(holiday_date DATE,
name CHARACTER VARYING(80))
AS $$
BEGIN
INSERT INTO config.trading_holiday(holiday_date,name)
VALUES(sp_add_holiday.holiday_date,sp_add_holiday.name);
END
$$
LANGUAGE PLPGSQL;
次に、最初の休日を追加するための単純な呼び出しが行われます。
CALL config.sp_add_holiday(holiday_date='2018-01-01',name='New Years Day');
そして、私は次のエラーメッセージを受け取ります:
[2018-08-07 11:56:18] [42703] ERROR: column "holiday_date" does not exist
[2018-08-07 11:56:18] Position: 21
手動挿入を行う、例えば:
INSERT INTO config.trading_holiday(holiday_date,name)
VALUES('2018-01-01','New Years Day');
正常に動作します:
[2018-08-07 12:04:01] 1 row affected in 2 ms
PostgeSQL 11のSQLプロシージャ機能は新しくなっていますが(そうではありませんか?)、これはそのような単純なプロシージャのようです。私は何を間違っていますか?
問題は、パラメーターの割り当て呼び出し中にあります。 fixへ:
CALL config.sp_add_holiday(holiday_date => '2018-01-01', name => 'New Years Day');
db <> fiddle ここ
パラメータ表記は、関数とプロシージャで同じです(Postgres 11の新機能)。 マニュアル:
名前付きパラメーターの使用を含む、関数およびプロシージャ呼び出し構文の詳細については、 セクション4. を参照してください。
太字私の強調。
誤って=
を使用しています。それは単純な古い "equal"演算子 で、ブール式を形成します。明らかにあなたが意図したものではありません。式が評価され、Postgresは呼び出しSQLコンテキストで「holiday_date」という名前の列を探しますが、それを見つけることができません。したがって、エラーメッセージ:
ERROR: column "holiday_date" does not exist
=>
(SQL標準表記)または:=
のみが、呼び出しでのパラメーター割り当てに有効です。 マニュアルの詳細 関連:
誤解の歴史の使用について...
=
および:=
。=
でのDEFAULT
の短い構文としてのCREATE FUNCTION
の使用と、現在はCREATE PROCEDURE
ステートメント。=>
および:=
関数呼び出し。参考文献: