sql >> Databasteknik >  >> RDS >> PostgreSQL

Kan inte köra block i PostgreSQL 8.2

Det låter som att du försöker köra en PL/PgSQL kodblock fristående, utan att slå in det i en funktion med code>SKAPA ELLER ERSÄTT FUNKTION . Det kommer inte att fungera, du måste inkludera det i en funktion eller (från PostgreSQL 9.0) en DO blockera . PL/PgSQL och vanlig SQL är olika språk så du kan inte bara köra PL/PgSQL-kod direkt.

Det skulle hjälpa om du förklarade varför du försöker skriva koden du klistrade in. Jag misstänker att du försöker lösa ett problem som är bättre att hantera med en triggerfunktion som en revisionstrigger .

Några viktiga anmärkningar:

Du måste uppdatera PostgreSQL :PostgreSQL 8.2 är farligt inaktuell och stöds inte . säkerhet och buggfixar släpps inte längre. Uppgradera brådskande till en version som stöds, men se till att läsa release notes a> för varje större ".0"-version som "8.3.0", "8.4.0" etc för migrerings- och kompatibilitetsråd.

Undvik 'nu' :Dessutom, istället för att använda 'nu' du bör vanligtvis använda aktuellt datum/tid funktioner , särskilt current_timestamp .

current_timestamp är stabil :Hoophoppningen du gör är förmodligen onödig eftersom värdet på current_timestamp (och 'now'::timestamp ) ändras inte under transaktionens varaktighet. T.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

Detaljer

Din avsikt verkar vara något i stil med följande (felaktigt, använd inte ) kod:

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

men du har missbrukat char datatype, som kräver en längdparameter. Den är som standard 1 om den inte tillhandahålls så du får:

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

ALDRIG använd char datatyp i SQL; använd varchar eller text . För portabilitet över databaser varchar(n) där n är en maximal längd krävs; om portabilitet inte behövs använd text .

Om du ändrar char till text i ovanstående kan din kod köras, men det är fortfarande inte meningsfullt. Jag misstänker starkt att du verkligen vill skriva:

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

... men du visste inte om aktuella datum-/tidsfunktioner .

Även det är för mycket, egentligen. Jag tror att du försöker lösa ett problem som passar bättre för en trigger.




  1. MySQL GROUP BY två kolumner

  2. Infoga värdelistan matchar inte kolumnlistan:1136 Kolumnantal matchar inte värdeantal

  3. Använder samma kolumn flera gånger i WHERE-satsen

  4. Associera tabeller med hjälp av Room-databasen i Android Studio