Khai báo biến của loại bảng trong PL / pgSQL


8

Tôi tự hỏi nếu có một cách để khai báo một biến loại bảng trong PL / pgSQL để giữ kết quả truy vấn? Chẳng hạn, làm thế nào tôi có thể diễn đạt một cái gì đó như:

q1 = select * from foo;
q2 = select * from bar;
for t1 in q1:
  for t2 in q2:
    -- do something with t1 and t2

Tôi đã xem xét cấu trúc trả về tiếp theo nhưng dường như chỉ có thể xử lý các giá trị trả về.


2
PL / SQL => Oracle, PGPL / SQL => PostgreSQL. Bạn đang làm việc với cái nào?
Mat

@Mat: Đó là PL / pgSQL , btw.
Erwin Brandstetter

Câu trả lời:


11

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 FORvò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 recordkhô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.


2
Cũng lưu ý rằng nếu bạn muốn trả về loại bảng, bạn có thể chỉ cần nói một cái gì đó nhưCREATE FUNCTION footest() RETURNS SETOF foo LANGUAGE PLPGSQL AS $$...
Chris Travers

Tại sao sau đó tất cả chúng ta đều có tính năng của "các loại hỗn hợp" nếu chúng ta có thể tạo các bảng thay thế, mà không bị hạn chế áp dụng cho các loại tổng hợp (không có ràng buộc, v.v.)? Cách duy nhất có ý nghĩa trong việc sử dụng các kiểu hỗn hợp mà tôi thấy là trả về một vài (hoặc một vài) tham số từ một hàm thay vì tạo toàn bộ bảng cho điều đó.
EngineeringSpock
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.