PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Impossible d'exécuter le bloc dans PostgreSQL 8.2

Il semble que vous essayez d'exécuter un PL/PgSQL bloc de code autonome, sans l'encapsuler dans une fonction en utilisant CREATE OR REPLACE FUNCTION . Cela ne fonctionnera pas, vous devez l'inclure dans une fonction ou (à partir de PostgreSQL 9.0) un DO bloquer . PL/PgSQL et plain SQL sont des langages différents vous ne pouvez donc pas simplement exécuter directement du code PL/PgSQL.

Cela aiderait si vous expliquiez pourquoi vous essayez d'écrire le code que vous avez collé. Je soupçonne que vous essayez de résoudre un problème qui est mieux géré avec une fonction trigger comme un déclencheur d'audit .

Quelques remarques importantes :

Vous devez mettre à jour PostgreSQL :PostgreSQL 8.2 est dangereusement obsolète et non pris en charge . la sécurité et les corrections de bogues ne sont plus publiées. Mettez à niveau de toute urgence vers une version prise en charge, mais assurez-vous de lire les notes de version pour chaque version majeure ".0" comme "8.3.0", "8.4.0", etc. pour des conseils de migration et de compatibilité.

Évitez 'now' :Aussi, au lieu d'utiliser 'now' vous devez généralement utiliser la date/heure actuelle fonctions , en particulier current_timestamp .

current_timestamp est stable  :Le saut de cerceau que vous faites est probablement inutile car la valeur de current_timestamp (et 'now'::timestamp ) ne change pas pendant la durée d'une transaction. Ex :

regress=# BEGIN;
regress=# SELECT current_timestamp;
 2012-08-14 14:52:43.382596+08
regress=# SELECT pg_sleep(5);
regress=# SELECT current_timestamp;
 2012-08-14 14:52:43.382596+08

Détails

Votre intention semble être quelque chose comme ce qui suit (incorrect, ne pas utiliser ) code :

CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
DECLARE
        curtime char;
BEGIN
        curtime := 'now';
        INSERT INTO logtable VALUES (logtxt, curtime);
        RETURN curtime;
END;
$$ LANGUAGE 'plpgsql';

mais vous avez abusé du char type de données, qui nécessite un paramètre de longueur. Il est par défaut à 1 s'il n'est pas fourni, vous obtiendrez donc :

regress=# SELECT some_function();
ERROR:  value too long for type character(1)
CONTEXT:  PL/pgSQL function "some_function" line 5 at assignment

JAMAIS utilisez le char type de données en SQL ; utilisez varchar ou text . Pour la portabilité entre bases de données varchar(n)n est une longueur maximale est requise ; si la portabilité n'est pas nécessaire, utilisez text .

Si vous modifiez char en text dans ce qui précède, votre code peut s'exécuter, mais cela n'a toujours aucun sens. Je soupçonne fortement que vous voulez vraiment écrire :

CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
BEGIN
        INSERT INTO logtable VALUES (logtxt, current_timestamp);
        RETURN current_timestamp;
END;
$$ LANGUAGE 'plpgsql';

... mais vous ne connaissiez pas le Fonctions date/heure actuelles .

C'est même trop, vraiment. Je pense que vous essayez de résoudre un problème qui correspond mieux à un déclencheur.