2013-01-31 29 views
5

Tôi có một chức năng Postgres mà đang trở lại một bảng:Postgres chức năng quay trở lại bảng không trả lại dữ liệu trong các cột

CREATE OR REPLACE FUNCTION testFunction() RETURNS TABLE(a int, b int) AS 
$BODY$ 
DECLARE a int DEFAULT 0; 
DECLARE b int DEFAULT 0; 
BEGIN 
CREATE TABLE tempTable AS SELECT a, b; 
RETURN QUERY SELECT * FROM tempTable; 
DROP TABLE tempTable; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

Chức năng này không được trả lại dữ liệu trong hàng và cột hình thức. Thay vào đó, nó trả về dữ liệu dưới dạng:

(0,0) 

Điều đó đang gây ra sự cố trong khối cffery Coldfusion trong trích xuất dữ liệu. Làm cách nào để lấy dữ liệu trong hàng và cột khi bảng được trả về từ hàm này? Nói cách khác: Tại sao hàm PL/pgSQL không trả về dữ liệu dưới dạng cột?

+0

Tại sao bạn sử dụng bảng tạm thời? Điều đó hoàn toàn không cần thiết và làm cho mọi việc chậm hơn mà không có bất kỳ lợi thế nào (và bạn có thể sử dụng một hàm 'SQL' đơn giản sẽ làm cho mọi việc nhanh hơn một chút) –

Trả lời

10

Để có được cột cá nhân thay vì các loại hàng, gọi hàm với:

SELECT * FROM testfunction(); 

Cũng giống như bạn sẽ chọn tất cả các cột từ một bảng.
Cũng xem xét hình thức này xem xét các chức năng thử nghiệm của bạn:

CREATE OR REPLACE FUNCTION testfunction() 
    RETURNS TABLE(a int, b int) AS 
$func$ 
DECLARE 
    _a int := 0; 
    _b int := 0; 
BEGIN 
    CREATE TEMP TABLE tbl AS SELECT _a, _b; 
    RETURN QUERY SELECT * FROM tbl; 
    DROP TABLE tempTable; 
END 
$func$ LANGUAGE plpgsql; 

Đặc biệt:

  • DECLARE từ khóa chỉ cần một lần.
  • Tránh khai báo các tham số đã được khai báo là OUT trong mệnh đề RETURNS TABLE (...).
  • Không sử dụng số nhận dạng CaMeL không xác định trong Postgres. Nó hoạt động, các định danh không được trích dẫn một diễn viên cho trường hợp thấp hơn, nhưng nó dẫn đến các lỗi gây nhầm lẫn. Xem

Bảng tạm thời là hoàn toàn vô dụng trong ví dụ này (có lẽ quá đơn giản). Bạn có thể giảm xuống:

CREATE OR REPLACE FUNCTION testfunction(OUT a int, OUT b int) AS 
$func$ 
BEGIN 
    a := 0; 
    b := 0; 
END 
$func$ LANGUAGE plpgsql; 
+0

Chính xác và cảm ơn câu trả lời của nó. –

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