PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Tidak dapat menjalankan blok di PostgreSQL 8.2

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pertahankan zona waktu dalam jenis stempel waktu PostgreSQL

  2. Arti dari prompt baris perintah yang berbeda di PostgreSQL?

  3. Bagaimana cara menjatuhkan pengguna di postgres jika memiliki objek yang bergantung

  4. Apakah postgres adalah pengguna PostgreSQL default dan khusus?

  5. Kembalinya XFS di Linux