2013-01-06 38 views
6

Làm cách nào để chuyển đổi truy vấn chọn đơn giản như select * from customers thành thủ tục/chức năng được lưu trữ trong pg?Hàm PostgreSQL đơn giản trả về hàng

Tôi mới sử dụng Postgres và create function customers() as returns table/setof không cảm thấy đúng và do đó câu hỏi ở đây.

Tôi hiểu procs được gọi là "chức năng" trong vùng đất. Do đó, create procedure không tồn tại và các tùy chọn duy nhất của tôi là tạo chế độ xem hoặc chức năng. Vấn đề là create function x() returns setof y trả về một hàng paren được phân tách bằng dấu phẩy của các giá trị không thể được sử dụng mà không cần xử lý thêm (ít nhất đó là những gì tôi thấy trong pgAdmin và Ruby/Sequel).

create function x() returns table(...) yêu cầu tôi nhúng định nghĩa hàng mà tôi không muốn.

Tôi chắc chắn có lý do đằng sau tất cả điều này nhưng tôi ngạc nhiên rằng trường hợp sử dụng phổ biến nhất là điều này phức tạp.

+3

[Bạn đã thử gì?] (Http://whathaveyoutried.com) –

+2

@rebnoob Thay vì "không hoạt động" - chỉ định ** toàn văn của hàm bạn đã thử và thông báo lỗi kết quả ** là cũng như phiên bản PostgreSQL của bạn. –

+0

Tuyệt vời! Cảm ơn Erwin và Craig. – rebnoob

Trả lời

11

chưa được kiểm tra nhưng phải về ngay:

CREATE OR REPLACE FUNCTION getcustomers() RETURNS SETOF customers AS $$ 
SELECT * FROM customers; 
$$ LANGUAGE sql; 
+2

hoạt động, cảm ơn bạn. Nhưng pg dường như chỉ trả về một cột với các giá trị bằng dấu phẩy thay vì các cột thực tế, cái gì cho? – rebnoob

+1

@rebnoob Bạn đang gọi nó với một cái gì đó như 'SELECT x FROM getcustomers() x'. Bạn muốn sử dụng 'SELECT getcustomers();' hoặc 'SELECT * FROM getcustomers();'. –

11

Vấn đề là "tạo ra chức năng x() trả về setof y" trả về một paren'd dấu phẩy tách ra giá trị hàng mà không thể được sử dụng mà không thêm chế biến

Kể từ khi chức năng trả về một loại bản ghi/liên tiếp, bạn phải gọi nó với

SELECT * FROM getcustomers(); 

để phân tách hàng trả lại thành các cột riêng lẻ.

manual on CREATE FUNCTION phải là điểm khởi đầu tốt. Phần ví dụ bao gồm chủ đề này.

+0

Bạn thưa bạn .. là một Jedi và lực lượng để tính toán! – faizanjehangir

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