sql >> Database >  >> RDS >> PostgreSQL

Kan blok niet uitvoeren in PostgreSQL 8.2

Het klinkt alsof je een PL/PgSQL probeert uit te voeren codeblok stand-alone, zonder het in een functie te stoppen met behulp van CREATE OR REPLACE FUNCTION . Dat werkt niet, je moet het opnemen in een functie of (van PostgreSQL 9.0) een DO blokkeren . PL/PgSQL en gewone SQL zijn verschillende talen dus je kunt PL/PgSQL-code niet zomaar rechtstreeks uitvoeren.

Het zou helpen als je uitlegt waarom je probeert de code te schrijven die je hebt geplakt. Ik vermoed dat je een probleem probeert op te lossen dat beter kan worden opgelost met een triggerfunctie zoals een audit-trigger .

Enkele belangrijke opmerkingen:

Je moet PostgreSQL updaten :PostgreSQL 8.2 is gevaarlijk verouderd en niet ondersteund . beveiligings- en bugfixes worden niet langer vrijgegeven. Upgrade dringend naar een ondersteunde versie, maar lees zeker de release-opmerkingen voor elke belangrijke ".0"-versie zoals "8.3.0", "8.4.0", enz. voor advies over migratie en compatibiliteit.

Vermijd 'now' :Ook, in plaats van 'now' u moet gewoonlijk de huidige datum/tijd gebruiken functies , in het bijzonder current_timestamp .

current_timestamp is stabiel :Het hoepelspringen dat u doet is waarschijnlijk niet nodig omdat de waarde van current_timestamp (en 'now'::timestamp ) verandert niet voor de duur van een transactie. Bijv.:

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

Details

Uw bedoeling lijkt ongeveer het volgende te zijn (onjuist, niet gebruiken ) 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';

maar je hebt de char . misbruikt datatype, waarvoor een lengteparameter vereist is. Het staat standaard op 1 als het niet wordt geleverd, dus je krijgt:

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

NOOIT gebruik de char gegevenstype in SQL; gebruik varchar of text . Voor cross-database portabiliteit varchar(n) waar n is een maximale lengte vereist; als draagbaarheid niet nodig is, gebruik dan text .

Als u char . wijzigt naar text in het bovenstaande kan uw code worden uitgevoerd, maar het heeft nog steeds geen zin. Ik vermoed sterk dat je echt wilt schrijven:

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

... maar je wist niets van de huidige datum/tijd functies .

Zelfs dat is eigenlijk te veel. Ik denk dat je een probleem probeert op te lossen dat beter past bij een trigger.




  1. mysql Ongeldig aantal kolommen in CSV-invoer tijdens het importeren van csv-bestand

  2. MySQL Voeg twee tabellen samen met door komma's gescheiden waarden

  3. Geen geldige maand op een INSERT-statement

  4. Converteer mysql DATETIME-kolom naar epoch-seconden