web-dev-qa-db-fra.com

Erreur "colonne ... n'existe pas" lors de l'appel d'une procédure SQL (nouveau dans PostgreSQL 11)

Avec PostgreSQL 11 Beta 2, une table trading_holiday Très simple est créée dans le schéma 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);

Ensuite, une procédure stockée très simple, config.sp_add_holiday Est créée pour ajouter des vacances à la table:

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;

Ensuite, un simple appel est effectué pour ajouter le premier jour férié:

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

Et j'obtiens le message d'erreur suivant:

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

Faire un insert manuel, par exemple:

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

Fonctionne avec succès:

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

Bien qu'il soit nouveau dans la fonctionnalité de procédure SQL de PostgeSQL 11 (qui ne l'est pas?), Cela semble être un processus si simple. Qu'est-ce que je fais de mal dans le monde?

3
Michael Goldshteyn

Le problème vient de l'affectation des paramètres dans l'appel . Pour corriger :

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

db <> violon ici

Explication

La notation des paramètres est la même pour les fonctions et les procédures (nouveau dans Postgres 11). Le manuel:

Voir Section 4. pour les détails complets sur la syntaxe d'appel de fonction et de procédure, y compris l'utilisation des paramètres nommés .

Gras accentuation mienne.

Vous utilisez = par erreur. C'est l'ancien opérateur "égal" , formant une expression booléenne . Évidemment pas ce que vous vouliez. L'expression est évaluée, Postgres recherche une colonne nommée "holiday_date" dans le contexte SQL appelant et ne la trouve pas. D'où le message d'erreur:

ERROR: column "holiday_date" does not exist

Uniquement => (notation standard SQL) ou := sont valables pour le paramétrage dans l'appel. Détails dans le manuel. Connexes:

Il y a une histoire de malentendus autour de l'utilisation de ...

  • ... les opérateurs = et := dans code plpgsql .
  • ... l'utilisation de = comme syntaxe courte pour DEFAULT dans CREATE FUNCTION et maintenant aussi CREATE PROCEDURE instructions.
  • ... la notation d'affectation => et := dans la fonction appelle .

Lectures complémentaires:

3
Erwin Brandstetter