2010-07-01 2 views
42

Существует почти идентичный, но не ответивший на вопрос here.Как объявить локальные переменные в postgresql?

Я переношу приложение из MS SQL Server в PostgreSQL. Во многих местах кода я использую локальные переменные, поэтому я хотел бы пойти на изменение, требующее меньше работы, поэтому не могли бы вы рассказать мне, что является лучшим способом перевести следующий код?

-- 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 

это возвращает:

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

(1 row(s) affected) 

Я буду использовать Postgresql 8,4 или даже 9,0, если она содержит существенные fetaures, что упростит перевод.

+0

Это сообщение может помочь? http://stackoverflow.com/questions/36959/how-do-you-use-script-variables-in-postgresql – jheppinstall

+0

Возможно идентично http://stackoverflow.com/questions/36959/how-do-you-use -script-variables-in-postgresql –

+0

Кажется, что вам нужно ждать 9.0 - ["DO - выполнить анонимный кодовый блок"] (http://developer.postgresql.org/pgdocs/postgres/sql-do.html). –

ответ

61

Postgresql исторически не поддерживает процедурный код на командном уровне - только внутри функций. Однако в Postgresql 9 была добавлена ​​поддержка execute an inline code block, которая фактически поддерживает что-то подобное, хотя синтаксис, возможно, немного нечетный, и существует множество ограничений по сравнению с тем, что вы можете делать с SQL Server. Примечательно, что встроенный блок кода не может вернуть результирующий набор, поэтому его нельзя использовать для того, что вы начертили выше.

В общем, если вы хотите написать какой-то процедурный код и вернуть результат, вам нужно поместить его внутрь функции. Например:

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(); 

Протокол PostgreSQL провода не, насколько я знаю, позволить таким вещам, как команды возвращающих несколько наборов результатов. Поэтому вы не можете просто сопоставлять партии T-SQL или хранимые процедуры с функциями PostgreSQL.

+0

протокол проводки позволяет выполнять несколько команд. и, следовательно, несколько разных наборов результатов (в асинхронном режиме). – Jasen

+0

@Jasen Я специально имел в виду один запрос, возвращающий несколько наборов результатов/количество результатов, а не несколько циклов запроса-ответа в полете. Хотя даже эта ситуация может измениться с 2010 года. – araqnid

+0

может быть возможно переписать задачу как несколько вызовов. 'select * from f1(); выберите * из f2(); выберите * из f3(); 'и, следовательно, получите несколько разных наборов результатов. – Jasen

Смежные вопросы