web-dev-qa-db-ja.com

SQLプロシージャを呼び出すときの「列...は存在しません」エラー(PostgreSQL 11の新機能)

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プロシージャ機能は新しくなっていますが(そうではありませんか?)、これはそのような単純なプロシージャのようです。私は何を間違っていますか?

3

問題は、パラメーターの割り当て呼び出し中にあります。 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標準表記)または:=のみが、呼び出しでのパラメーター割り当てに有効です。 マニュアルの詳細 関連:

誤解の歴史の使用について...

  • ... plpgsql codeの演算子=および:=
  • ... =でのDEFAULTの短い構文としてのCREATE FUNCTIONの使用と、現在はCREATE PROCEDUREステートメント。
  • ...割り当て表記=>および:=関数呼び出し

参考文献:

3