2012-08-16 33 views
22

Tôi muốn sử dụng SELECT INTO để tạo một bảng tạm thời theo một trong các chức năng của tôi. SELECT INTO hoạt động trong SQL chứ không phải PL/pgSQL.SELECT .. INTO để tạo một bảng trong PL/pgSQL

Lệnh này tạo một bảng gọi là mytable (Nếu orig_table tồn tại như một mối quan hệ):

SELECT * 
INTO TEMP TABLE mytable 
FROM orig_table; 

Nhưng đưa chức năng này vào PostgreSQL, và bạn nhận được lỗi: ERROR: "temp" is not a known variable

CREATE OR REPLACE FUNCTION whatever() 
RETURNS void AS $$ 
BEGIN 
    SELECT * 
    INTO TEMP TABLE mytable 
    FROM orig_table; 
END; $$ LANGUAGE plpgsql; 

tôi có thể SELECT INTO một biến loại record trong PL/pgSQL, nhưng sau đó tôi phải xác định cấu trúc khi lấy dữ liệu ra khỏi bản ghi đó. SELECT INTO thực sự đơn giản - tự động tạo một bảng có cùng cấu trúc truy vấn SELECT. Có ai có bất kỳ lời giải thích cho lý do tại sao điều này không hoạt động bên trong một chức năng?

Có vẻ như SELECT INTO hoạt động khác với PL/pgSQL, vì bạn có thể chọn các biến mà bạn đã khai báo. Tuy nhiên, tôi không muốn khai báo cấu trúc bảng tạm thời của mình. Tôi ước nó sẽ tạo ra cấu trúc tự động giống như trong SQL.

Trả lời

36

Hãy thử

CREATE TEMP TABLE mytable AS 
SELECT * 
FROM orig_table; 

mỗi http://www.postgresql.org/docs/current/static/sql-selectinto.html

CREATE TABLE AS is functionally similar to SELECT INTO. CREATE TABLE AS is the recommended syntax, since this form of SELECT INTO is not available in ECPG or PL/pgSQL, because they interpret the INTO clause differently. Furthermore, CREATE TABLE AS offers a superset of the functionality provided by SELECT INTO.

+0

Cảm ơn! Tôi biết tôi đã giải quyết vấn đề này trước đây, và tôi nhớ câu đó từ các tài liệu postgresql. Tôi đã hoàn toàn quên về CREATE TABLE AS. – nnyby

+0

Điều đó khiến tôi hoàn toàn bối rối một chút - cảm ơn. – mvexel

Các vấn đề liên quan