2011-02-04 29 views

Trả lời

14

Bạn cần tạo chuỗi, nối vào tên bảng động và sau đó sử dụng thực thi. Lưu ý rằng bạn thoát khỏi 'by' '. Điều này cũng bao gồm một tên động để lưu tệp. Bạn cần phải thay thế savedir bằng thư mục thực tế bạn đang sử dụng.

CREATE OR REPLACE FUNCTION dynamicCopy(tablename text, outname text) RETURNS VOID AS $$ 

DECLARE STATEMENT TEXT; 

BEGIN 

    STATEMENT := 'COPY (select * from ' || quote_ident(tablename) || ') to ''savedir' || outname ||'.txt'''; 

    EXECUTE STATEMENT; 

END; 

$$ LANGUAGE 'plpgsql'; 

EDIT:

Kể từ lần đầu tiên tôi viết bài này, tôi đã khám phá ra chức năng định dạng, mà tôi nghĩ là thường dễ đọc hơn SQL được tạo ra với các nhà điều hành nối || và linh hoạt hơn.

CREATE OR REPLACE FUNCTION dynamicCopy(tablename text, outname text) RETURNS VOID AS 
$BODY$ 
BEGIN 
    EXECUTE FORMAT('COPY (SELECT * FROM %s) TO ''savedir%s.csv''', 
        tablename, 
        outname); 
END 
$BODY$ 
LANGUAGE plpgsql; 

Xem các tài liệu chính thức cho một cuộc thảo luận đầy đủ: https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

+3

dụ mã của bạn thực sự cho thấy một tập tin tên được tạo tự động chứ không phải là một bảng tên được tạo tự động. Ngoài ra, bạn không đề cập rằng mã ví dụ của bạn chỉ định đầu ra được phân tách bằng dấu phẩy, thay vì đầu ra được phân tách bằng tab mặc định. (Bạn đã sao chép mã ví dụ của bạn từ một nơi khác?) – ruakh

+0

Ruakh, cảm ơn bạn đã chỉ ra lỗi. Bây giờ chỉnh sửa với tên bảng dyanmic và tên tập tin. Vâng, đó là một phiên bản đơn giản hóa rất lớn của một cái gì đó tôi sử dụng tại nơi làm việc - tôi sẽ cẩn thận hơn trong tương lai để trả lời câu hỏi đúng. –

+0

Chúa Giêsu Kitô, nó đã cho tôi một thời gian để tìm ra các lỗi đánh máy trong quot_ident! Đó là quotE_ident thực sự! Bây giờ điều này có ý nghĩa: "pg_execute(): Truy vấn thất bại: LRI: 42883: hàm quot_ident (văn bản) không tồn tại" – zapadlo

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