Trong PostgreSQL , mọi tên bảng đóng vai trò là tên loại cho loại hàng (còn gọi là loại tổng hợp ) - không phải là loại bảng, không có "loại bảng" hoặc "biến bảng" trong Postgres ( nhưng có các bảng được nhập ).
Vì vậy, bạn chỉ có thể khai báo một biến của loại đó trong PL/pgSQL
.
CREATE FUNCTION foo()
RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
q1 foo; -- "foo" ...
q2 bar; -- ... and "bar" are existing (visible) table names
BEGIN
FOR q1 IN
SELECT * from foo
LOOP
FOR q2 IN
SELECT * from bar
LOOP
-- do something with q1 and q2
-- since q1 and q2 are well known types, you can access columns
-- with attribute notation. Like: q1.col1
END LOOP;
END LOOP;
END
$func$
Một FOR
vòng lặp hoạt động với một con trỏ tích hợp. Ngoài ra còn có con trỏ rõ ràng trong plpgsql.
Bạn cũng có thể chỉ cần khai báo các biến của loại chung record
. Nó có thể lấy bất kỳ loại hàng nào khi gán tự động. Nhưng các quy tắc đặc biệt được áp dụng. Hãy chắc chắn theo liên kết và đọc chương của hướng dẫn!
Mặc dù nó thường thuận tiện để có chức năng trả về SETOF <table name>
, nhưng việc trả lại SETOF record
không thuận tiện bằng. Hệ thống không biết hàm nào trả về theo cách này và bạn phải thêm danh sách định nghĩa cột với mỗi cuộc gọi. Đó là một nỗi đau. Chi tiết về các chức năng bảng trong hướng dẫn .
Tuy nhiên, thường có các giải pháp hiệu quả hơn với SQL đơn giản. Vòng lặp là một biện pháp của biện pháp cuối cùng, khi bạn có thể thực hiện mọi việc trong một lần quét trong đó bạn sẽ cần nhiều lần quét trong SQL thuần túy.