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.