sql >> Database teknologi >  >> RDS >> PostgreSQL

Ikke i stand til at køre blok i PostgreSQL 8.2

Det lyder som om du prøver at køre en PL/PgSQL kodeblok stand-alone uden at pakke den ind i en funktion ved hjælp af >CREATE OR REPLACE FUNCTION . Det virker ikke, du skal inkludere det i en funktion eller (fra PostgreSQL 9.0) en DO blokere . PL/PgSQL og almindelig SQL er forskellige sprog så du kan ikke bare køre PL/PgSQL-kode direkte.

Det ville hjælpe, hvis du forklarede hvorfor du prøver at skrive den kode, du indsatte. Jeg formoder, at du forsøger at løse et problem, der er bedre håndteret med en triggerfunktion som en revisionstrigger .

Nogle vigtige bemærkninger:

Du skal opdatere PostgreSQL :PostgreSQL 8.2 er farligt forældet og understøttet ikke . sikkerhed og fejlrettelser frigives ikke længere. Opgrader hurtigst muligt til en understøttet version, men sørg for at læse udgivelsesbemærkningerne a> for hver større ".0"-version som "8.3.0", "8.4.0" osv. for migrerings- og kompatibilitetsrådgivning.

Undgå 'now' :Også i stedet for at bruge 'now' du skal normalt bruge den aktuelle dato/klokkeslæt funktioner , især current_timestamp .

current_timestamp er stabil :Det hoop-jumping, du laver, er sandsynligvis unødvendigt, fordi værdien af ​​current_timestamp (og 'now'::timestamp ) ændres ikke i varigheden af ​​en transaktion. F.eks.:

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 hensigt ser ud til at være noget i stil med følgende (forkert, brug ikke ) kode:

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 misbrugt char datatype, som kræver en længdeparameter. Den er som standard 1, hvis den ikke leveres, 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 brug char datatype i SQL; brug varchar eller text . Til krydsdatabaseportabilitet varchar(n) hvor n er en maksimal længde påkrævet; hvis portabilitet ikke er nødvendig, brug text .

Hvis du ændrer char til text i ovenstående kan din kode køre, men det giver stadig ingen mening. Jeg formoder stærkt, at du virkelig vil skrive:

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 kendte ikke til aktuelle dato-/tidsfunktioner .

Selv det er virkelig for meget. Jeg tror, ​​du prøver at løse et problem, der passer bedre til en trigger.




  1. Hvordan får jeg SQLSRV-udvidelsen til at fungere med PHP, da MSSQL er forældet?

  2. SQL Server Change Recovery Model

  3. Bestem, om SP-parameter har en standardværdi i T-SQL

  4. Kan ikke oprette forbindelse til MySQL-server fejl 111