2016-03-18 17 views
5

Tôi không thể tìm thấy giải thích rõ ràng về cú pháp để tạo (và sử dụng) các bảng chỉ dành cho các phép tính bên trong của một hàm. Bất cứ ai có thể cho tôi một ví dụ cú pháp xin vui lòng?Chức năng postgresql bảng tạm thời

Từ những gì tôi đã tìm thấy, tôi đã cố gắng này (có và không có @ trước temp_table):

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

DECLARE @temp_table TABLE 
( 
     id int, 
     value text 
) 
BEGIN 
INSERT INTO @temp_table 
     SELECT id, value 
     FROM test.another_table; 

INSERT INTO test.out_table 
     SELECT id, value 
     FROM @temp_table; 
RETURN END 
$$ LANGUAGE SQL; 

tôi nhận được:

ERROR: syntax error at or near "DECLARE" LINE 5: DECLARE @temp_table TABLE

-

Tôi cũng đã thử Phương pháp TẠO TẠO đề xuất here, theo cách này:

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

    CREATE TABLE temp_table AS 
     SELECT id, value 
     FROM test.another_table; 

    INSERT INTO test.out_table 
     SELECT id, value 
     FROM temp_table; 

$$ LANGUAGE SQL; 

Và tôi có được điều này:

ERROR: relation "temp_table " does not exist LINE 11: FROM temp_table

(Rõ ràng, Tôi biết các temp_table là không cần thiết cho những gì tôi đang làm trong đoạn mã trên, nhưng đó không phải là điểm :) => Tôi muốn để hiểu được cú pháp để làm cho nó làm việc)

+0

Postgres sử dụng bảng tạm thời cho mục đích này. Các biến bảng là một tính năng của SQL Server. –

+0

Trong tài liệu hướng dẫn nào bạn tìm thấy cú pháp 'DECLARE @temp_table TABLE ...'? –

Trả lời

8

cú pháp thích hợp cho việc tạo một bảng temp là

create temp table... 

nhưng bạn phải chắc chắn để thả các bảng tạm thời trước khi hiện ra của hàm. Ngoài ra, tôi muốn đề nghị cú pháp này để thay thế:

CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
    SELECT id, value 
    FROM test.another_table; 

Vì vậy chức năng của bạn sẽ như thế này:

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

    CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
     SELECT id, value 
     FROM test.another_table; 

    INSERT INTO test.out_table 
     SELECT id, value 
     FROM temp_table; 

DROP TABLE temp_table; 

$$ LANGUAGE SQL; 

Nhưng nếu tôi có thể rất tốt bụng, tôi muốn viết lại chức năng này vì vậy nó chính xác hơn:

CREATE FUNCTION test.myfunction() 
RETURNS TABLE (id int, value varchar) -- change your datatype as needed 
AS $$ 
BEGIN; 
CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
    SELECT id, value 
    FROM test.another_table; 

INSERT INTO test.out_table 
    SELECT id, value 
    FROM temp_table; 

DROP TABLE temp_table; 

RETURN QUERY 
SELECT id, value 
from temp_table; 

END; 
$$ LANGUAGE plpgsql; 

Untested; cho tôi biết nếu điều này không thành công.

+0

Tôi sẽ kiểm tra nó tại nơi làm việc vào ngày mai và sẽ cho bạn biết (và chấp nhận nó nếu nó hoạt động), trong khi chờ đợi, tôi chỉ muốn cảm ơn bạn đã dành thời gian :) –

+0

Tôi gặp lỗi cú pháp vì 'CREATE 'tuyên bố. Chính xác hơn, tôi nhận được thông tin sau: 'L ERI: lỗi cú pháp tại hoặc gần" tạo "' // 'LINE 4: tạo TEMP TABLE temp_mag_ref_compl AS' // ' ********** Erreur * ********* '// ' L ERI: lỗi cú pháp tại hoặc gần "tạo" '// ' État SQL: 42601' // 'Caractère: 114' –

+0

vâng, bạn nói đúng. Tôi đã thay đổi nó để thêm "bắt đầu;" Và kết thúc;" Điều đó sẽ ngăn chặn lỗi cú pháp. – dizzystar

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