it-swarm.com.de

Fehler "Spalte ... existiert nicht" beim Aufrufen einer SQL-Prozedur (neu in PostgreSQL 11)

Mit PostgreSQL 11 Beta 2 ist ein sehr einfaches trading_holiday Tabelle wird im config Schema erstellt:

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);

Dann eine sehr einfache gespeicherte Prozedur, config.sp_add_holiday wird erstellt, um der Tabelle Feiertage hinzuzufügen:

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;

Dann wird ein einfacher Anruf getätigt, um den ersten Feiertag hinzuzufügen:

CALL config.sp_add_holiday(holiday_date='2018-01-01',name='New Years Day');

Und ich bekomme folgende Fehlermeldung:

[2018-08-07 11:56:18] [42703] ERROR: column "holiday_date" does not exist
[2018-08-07 11:56:18] Position: 21

Durchführen einer manuellen Einfügung, z.

INSERT INTO config.trading_holiday(holiday_date,name)
  VALUES('2018-01-01','New Years Day');

Funktioniert erfolgreich:

[2018-08-07 12:04:01] 1 row affected in 2 ms

Obwohl die PostgeSQL 11 SQL-Prozedurfunktionalität neu ist (wer nicht?), Scheint dies ein so einfacher Prozess zu sein. Was in aller Welt mache ich falsch?

3

Das Problem liegt in der Parameterzuweisung im Aufruf . Um zu beheben :

CALL config.sp_add_holiday(holiday_date => '2018-01-01', name => 'New Years Day');

db <> fiddle hier

Erläuterung

Die Parameternotation ist für Funktionen und Prozeduren gleich (neu in Postgres 11). Das Handbuch :

Siehe Abschnitt 4. für die vollständigen Details zur Funktions- und Prozeduraufrufsyntax, einschließlich der Verwendung benannter Parameter .

Mutige Betonung meiner.

Sie haben = aus Versehen. Das ist der einfache alte "gleiche" Operator , der einen booleschen Ausdruck bildet . Offensichtlich nicht das, was du beabsichtigt hast. Der Ausdruck wird ausgewertet. Postgres sucht im aufrufenden SQL-Kontext nach einer Spalte mit dem Namen "Holiday_date" und kann sie nicht finden. Daher die Fehlermeldung:

ERROR: column "holiday_date" does not exist

Nur => (SQL-Standardnotation) oder := gelten für die Parameterzuweisung im Aufruf. Details im Handbuch. Verwandte:

Es gibt eine Geschichte von Missverständnissen um die Verwendung von ...

  • ... die Operatoren = und := in plpgsql-Code .
  • ... die Verwendung von = als kurze Syntax für DEFAULT in CREATE FUNCTION und jetzt auch CREATE PROCEDURE Anweisungen.
  • ... die Zuweisungsnotation => und := in Funktionsaufrufen .

Weiterführende Literatur:

3