2010-07-01 69 views
42

Có câu hỏi gần giống, nhưng không thực sự được trả lời here.Làm thế nào để khai báo các biến cục bộ trong postgresql?

Tôi đang di chuyển một ứng dụng từ MS SQL Server sang PostgreSQL. Ở nhiều nơi trong mã tôi sử dụng các biến cục bộ để tôi muốn thay đổi đòi hỏi ít công việc hơn, vì vậy bạn có thể vui lòng cho tôi biết đó là cách tốt nhất để dịch mã sau đây?

-- MS SQL Syntax: declare 2 variables, assign value and return the sum of the two 
declare @One integer = 1 
declare @Two integer = 2 
select @One + @Two as SUM 

này trả về:

SUM 
----------- 
3 

(1 row(s) affected) 

tôi sẽ sử dụng PostgreSQL 8.4 hoặc thậm chí 9.0 nếu nó chứa fetaures đáng kể mà sẽ đơn giản hóa dịch.

+0

bài đăng này có thể hữu ích? http://stackoverflow.com/questions/36959/how-do-you-use-script-variables-in-postgresql – jheppinstall

+0

Có thể giống hệt với http://stackoverflow.com/questions/36959/how-do-you-use -script-variables-in-postgresql –

+0

Có vẻ như bạn phải chờ 9,0 - ["DO - thực thi một khối mã ẩn danh"] (http://developer.postgresql.org/pgdocs/postgres/sql-do.html). –

Trả lời

61

Postgresql lịch sử không hỗ trợ mã thủ tục ở cấp lệnh - chỉ trong các hàm. Tuy nhiên, trong Postgresql 9, sự hỗ trợ đã được thêm vào execute an inline code block có hiệu quả hỗ trợ một cái gì đó như thế này, mặc dù cú pháp có lẽ là một chút lẻ, và có rất nhiều hạn chế so với những gì bạn có thể làm với SQL Server. Đáng chú ý, khối mã nội tuyến không thể trả lại tập kết quả, do đó không thể sử dụng cho những gì bạn phác thảo ở trên.

Nói chung, nếu bạn muốn viết một số mã thủ tục và yêu cầu trả lại kết quả, bạn cần đặt nó bên trong một hàm. Ví dụ:

CREATE OR REPLACE FUNCTION somefuncname() RETURNS int LANGUAGE plpgsql AS $$ 
DECLARE 
    one int; 
    two int; 
BEGIN 
    one := 1; 
    two := 2; 
    RETURN one + two; 
END 
$$; 
SELECT somefuncname(); 

Giao thức dây PostgreSQL không, theo như tôi biết, cho phép những thứ như lệnh trả về nhiều bộ kết quả. Vì vậy, bạn không thể chỉ đơn giản là bản đồ các lô T-SQL hoặc các thủ tục được lưu trữ cho các hàm PostgreSQL.

+0

giao thức dây cho phép một số lệnh. và do đó một số tập kết quả khác nhau (ở chế độ không đồng bộ). – Jasen

+0

@Chỉ tôi đặc biệt có nghĩa là một truy vấn trả về nhiều tập kết quả/số kết quả, thay vì có một số chu kỳ truy vấn phản hồi trong chuyến bay. Mặc dù thậm chí tình hình đó có thể đã thay đổi kể từ năm 2010. – araqnid

+0

có thể viết lại tác vụ đó dưới dạng nhiều cuộc gọi. 'select * từ f1(); chọn * từ f2(); chọn * từ f3(); 'và do đó nhận được nhiều tập hợp kết quả khác nhau. – Jasen

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