sql >> Databáze >  >> RDS >> PostgreSQL

Nelze spustit blok v PostgreSQL 8.2

Zdá se, že se pokoušíte spustit PL/PgSQL samostatný blok kódu, bez jeho zabalení do funkce pomocí CREATE OR REPLACE FUNCTION . To nebude fungovat, musíte to zahrnout do funkce nebo (od PostgreSQL 9.0) do DO zablokovat . PL/PgSQL a plain SQL jsou různé jazyky takže nemůžete přímo spouštět kód PL/PgSQL.

Pomohlo by, kdybys vysvětlil proč pokoušíte se napsat kód, který jste vložili. Mám podezření, že se snažíte vyřešit problém, který je lepší vyřešit pomocí funkce spouštěcí funkce jako spouštěč auditu .

Některé důležité poznámky:

Musíte aktualizovat PostgreSQL :PostgreSQL 8.2 je nebezpečně zastaralý a nepodporován . zabezpečení a opravy chyb již nejsou vydávány. Urychleně upgradujte na podporovanou verzi, ale nezapomeňte si přečíst poznámky k vydání pro každou hlavní verzi ".0", jako je "8.3.0", "8.4.0" atd. pro rady ohledně migrace a kompatibility.

Vyhněte se 'now' :Také místo použití 'now' obvykle byste měli používat aktuální datum/čas funkce , zejména current_timestamp .

current_timestamp je stabilní :Přeskakování, které děláte, je pravděpodobně zbytečné, protože hodnota current_timestamp (a 'now'::timestamp ) se po dobu trvání transakce nemění. Např.:

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

Podrobnosti

Zdá se, že váš záměr je něco jako následující (nesprávné, nepoužívejte ) kód:

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

ale zneužili jste char datový typ, který vyžaduje parametr délky. Výchozí hodnota je 1, pokud není dodaná, takže dostanete:

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

NIKDY použijte char datový typ v SQL; použijte varchar nebo text . Pro přenositelnost mezi databázemi varchar(n) kde n je požadována maximální délka; pokud přenositelnost není nutná, použijte text .

Pokud změníte char na text ve výše uvedeném se váš kód může spustit, ale stále to nedává žádný smysl. Silně mám podezření, že opravdu chcete napsat:

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

... ale nevěděli jste o funkce aktuálního data/času .

I to je moc, opravdu. Myslím, že se snažíte vyřešit problém, který je vhodnější pro spouštěč.




  1. vytvoření pole z databáze

  2. cakephp 3.0 získá hodnoty ve dvou sloupcích jako jeden

  3. Oracle UpdateXML() mění strukturu XML?

  4. Uložená procedura MySQL s IF/THEN/ELSE