Đây là do thiết kế. Sách hướng dẫn giải thích trong chương Thay thế biến :
Thay thế biến hiện chỉ hoạt động trong
SELECT
,INSERT
,UPDATE
vàDELETE
các lệnh, bởi vì công cụ SQL chính chỉ cho phép các tham số truy vấn trong các lệnh này. Để sử dụng tên hoặc giá trị không phải là hằng số trong các kiểu câu lệnh khác (thường được gọi là câu lệnh tiện ích), bạn phải xây dựng câu lệnh tiện ích dưới dạng một chuỗi vàEXECUTE
nó.
Bạn không thể tham số hóa giá trị trong một câu lệnh động với EXECUTE
bởi vì, trích dẫn chương Thực thi lệnh động :
Một hạn chế khác đối với các ký hiệu tham số là chúng chỉ hoạt động trong
SELECT
,INSERT
,UPDATE
vàDELETE
các lệnh. Trong các loại câu lệnh khác (thường được gọi là câu lệnh tiện ích), bạn phải chèn giá trị theo văn bản ngay cả khi chúng chỉ là giá trị dữ liệu.
Tùy chọn duy nhất trong một hàm plpgsql là để nối giá trị vào chuỗi lệnh. Bạn có thể sử dụng format()
, nhưng đối với ví dụ đơn giản, nối đơn giản là an toàn và dễ dàng ::
CREATE OR REPLACE FUNCTION pg_temp.setdistinct(_cnt real)
RETURNS void
LANGUAGE plpgsql AS
$$
BEGIN
EXECUTE 'ALTER TABLE _temp ALTER COLUMN id SET (n_distinct=' || _cnt || ')';
END
$$;
Chất lượng lược đồ pg_temp.
làm cho nó trở thành một chức năng "tạm thời" (không có tài liệu!), phản ánh câu hỏi.
Hướng dẫn sử dụng về n_distinct
.