PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Không thể chạy khối trong PostgreSQL 8.2

Có vẻ như bạn đang cố chạy PL / PgSQL khối mã độc lập, không cần gói nó trong một hàm bằng cách sử dụng CREATE OR REPLACE FUNCTION . Điều đó sẽ không hoạt động, bạn cần phải đưa nó vào một hàm hoặc (từ PostgreSQL 9.0) DO khối . PL / PgSQL và SQL thuần túy là các ngôn ngữ khác nhau vì vậy bạn không thể chỉ chạy trực tiếp mã PL / PgSQL.

Sẽ hữu ích nếu bạn giải thích tại sao bạn đang cố viết mã bạn đã dán. Tôi nghi ngờ bạn đang cố gắng giải quyết một vấn đề được xử lý tốt hơn bằng chức năng kích hoạt giống như trình kích hoạt kiểm tra .

Một số lưu ý quan trọng:

Bạn cần cập nhật PostgreSQL :PostgreSQL 8.2 đã lỗi thời một cách nguy hiểm và không được hỗ trợ . các bản sửa lỗi và bảo mật không còn được phát hành nữa. Nâng cấp khẩn cấp lên phiên bản được hỗ trợ, nhưng hãy đảm bảo đọc ghi chú phát hành cho mỗi phiên bản ".0" chính như "8.3.0", "8.4.0", v.v. để được tư vấn về di chuyển và khả năng tương thích.

Tránh 'now' :Ngoài ra, thay vì sử dụng 'now' bạn thường nên sử dụng ngày / giờ hiện tại chức năng , cụ thể là current_timestamp .

current_timestamp ổn định :Nhảy vòng mà bạn đang thực hiện có thể không cần thiết vì giá trị của current_timestamp (và 'now'::timestamp ) không thay đổi trong suốt thời gian của một giao dịch. Vd:

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

Chi tiết

Ý định của bạn dường như giống như sau ( không chính xác, không sử dụng ) mã:

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

nhưng bạn đã sử dụng sai char kiểu dữ liệu, yêu cầu tham số độ dài. Nó mặc định là 1 nếu không được cung cấp, vì vậy bạn sẽ nhận được:

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

KHÔNG BAO GIỜ sử dụng char kiểu dữ liệu trong SQL; sử dụng varchar hoặc text . Đối với tính di động trên nhiều cơ sở dữ liệu varchar(n) ở đâu n là chiều dài tối đa được yêu cầu; nếu tính di động không cần thiết, hãy sử dụng text .

Nếu bạn thay đổi char thành text ở trên, mã của bạn có thể chạy, nhưng nó vẫn không có ý nghĩa gì. Tôi thực sự nghi ngờ rằng bạn thực sự muốn viết:

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

... nhưng bạn chưa biết về chức năng ngày / giờ hiện tại .

Thậm chí đó là quá nhiều, thực sự. Tôi nghĩ bạn đang cố gắng giải quyết một vấn đề phù hợp hơn với trình kích hoạt.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có nên bao gồm các CHỌN trong một giao dịch không?

  2. Di chuyển PostgreSQL sang Đám mây - So sánh các giải pháp từ Amazon, Google và Microsoft

  3. PG gem sẽ không cài đặt trong ứng dụng Rails:Gem ::Ext ::BuildError:ERROR:Không tạo được phần mở rộng gốc của gem

  4. Thực thi sql gốc với hibernate

  5. Truy vấn theo tọa độ mất quá nhiều thời gian - các tùy chọn để tối ưu hóa?