2013-08-19 36 views
30

Cách mặc định để gọi hàm select * from my_function()?Chức năng gọi với exec thay vì chọn

Tôi hỏi vì tôi đã xây dựng một chức năng mà không trả lại bất cứ điều gì, chỉ cần chèn dữ liệu vào một bảng và (đến từ một nền tảng SQL Server) nó "cảm thấy" lạ để gọi nó với select * from...

tôi mong đợi một cái gì đó giống như exec my_function()

Trả lời

32

sử dụng PERFORM tuyên bố - http://www.postgresql.org/docs/current/static/plpgsql-statements.html

Đôi khi nó rất hữu ích để đánh giá một biểu thức hoặc truy vấn SELECT nhưng loại bỏ kết quả, ví dụ khi gọi một hàm có các hiệu ứng phụ là nhưng không có giá trị kết quả hữu ích. Để làm điều này trong PL/pgSQL, sử dụng các PERFORM tuyên bố

vì vậy nó chỉ

DO $$ BEGIN 
    PERFORM my_function(); 
END $$; 
+12

'PERFORM' chỉ hợp lệ trong PL/PgSQL. Bạn không thể sử dụng nó độc lập. –

+0

có, nó phải được thực thi bên trong khối PL/PgSQL hoặc trong chức năng, được cập nhật –

14

Bạn sẽ sử dụng from khi hàm trả về một tập. Nếu hàm trả về void chỉ cần làm

select my_function(); 
27

Vâng, đó là cách tiêu chuẩn và có điều lạ.

Thông thường bạn sẽ viết các chức năng như các thủ tục được lưu trữ và gọi chúng bằng lệnh CALL hoặc EXECUTE. PostgreSQL không hỗ trợ các thủ tục được lưu trữ đúng (nhiều bộ kết quả, giao dịch tự động và tất cả điều đó), chỉ có các hàm do người dùng định nghĩa có thể gọi là.

Vì vậy, giải pháp thay thế là SELECT function_name() sử dụng cú pháp tiện ích mở rộng PostgreSQL bỏ qua FROM hoặc SELECT 1 FROM function_name(); là (một phần) tiêu chuẩn hơn.

Trình điều khiển ODBC, trình điều khiển JDBC, v.v. hiểu cú pháp thoát {call func_name()} và tự động dịch nó thành một số SELECT cơ bản.

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