Sepertinya Anda mencoba menjalankan PL/PgSQL
blok kode berdiri sendiri, tanpa membungkusnya dalam suatu fungsi menggunakan CREATE OR REPLACE FUNCTION
. Itu tidak akan berhasil, Anda harus memasukkannya ke dalam suatu fungsi atau (dari PostgreSQL 9.0) a DO
blokir
. PL/PgSQL dan SQL biasa adalah bahasa yang berbeda jadi Anda tidak bisa langsung menjalankan kode PL/PgSQL.
Akan membantu jika Anda menjelaskan mengapa Anda mencoba menulis kode yang Anda tempel. Saya menduga Anda mencoba memecahkan masalah yang lebih baik ditangani dengan fungsi pemicu seperti pemicu audit .
Beberapa catatan penting:
Anda perlu memperbarui PostgreSQL :PostgreSQL 8.2 sudah sangat usang dan tidak didukung . keamanan dan perbaikan bug tidak lagi dirilis. Tingkatkan segera ke versi yang didukung, tetapi pastikan untuk membaca catatan rilis untuk setiap versi ".0" utama seperti "8.3.0", "8.4.0", dll untuk saran migrasi dan kompatibilitas.
Hindari 'now'
:Juga, daripada menggunakan 'now'
Anda biasanya harus menggunakan tanggal/waktu saat ini fungsi
, khususnya current_timestamp
.
current_timestamp
stabil :Hoop-jumping yang Anda lakukan mungkin tidak diperlukan karena nilai current_timestamp
(dan 'now'::timestamp
) tidak berubah selama durasi transaksi. Misal:
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
Detail
Niat Anda tampaknya seperti berikut ini (salah, jangan gunakan ) 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';
tetapi Anda telah menyalahgunakan char
tipe data, yang membutuhkan parameter panjang. Defaultnya adalah 1 jika tidak disediakan sehingga Anda akan mendapatkan:
regress=# SELECT some_function();
ERROR: value too long for type character(1)
CONTEXT: PL/pgSQL function "some_function" line 5 at assignment
TIDAK PERNAH gunakan char
tipe data dalam SQL; gunakan varchar
atau text
. Untuk portabilitas lintas basis data varchar(n)
dimana n
adalah panjang maksimum yang diperlukan; jika portabilitas tidak diperlukan gunakan text
.
Jika Anda mengubah char
ke text
di atas, kode Anda mungkin berjalan, tetapi masih tidak masuk akal. Saya sangat curiga bahwa Anda benar-benar ingin menulis:
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';
... tetapi Anda tidak tahu tentang fungsi tanggal/waktu saat ini .
Bahkan itu terlalu banyak, sungguh. Saya pikir Anda mencoba memecahkan masalah yang lebih cocok untuk pemicu.