Я просто не могу понять их (работаю с PostgreSQL на сегодняшний день). Работа с версией 9.0.4 в Windows, используя pgAdmin III.
У меня относительно большой опыт работы с функциями MS SQL Server и SP.
Как я понял, в PostgreSQL нет прямого аналога MSSQL SP-ов (однако функции выглядят точно так же). Но вы можете создавать процедуры на других языках, которые могут быть встроены в postgres. До сих пор я смог произвести следующее:
CREATE OR REPLACE FUNCTION GetProduct()
RETURNS refcursor AS
$BODY$
DECLARE pr_cur refcursor;
BEGIN
OPEN pr_cur FOR
SELECT * FROM "Product";
RETURN pr_cur;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
И используйте это так (используя библиотеку Npgsql):
NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=*;Password=*;Database=Warehouse;");
conn.Open();
NpgsqlTransaction t = conn.BeginTransaction();
NpgsqlCommand command = new NpgsqlCommand("GetProduct", conn);
command.CommandType = CommandType.StoredProcedure;
NpgsqlDataAdapter da = new NpgsqlDataAdapter(command);
DataSet myDS = new DataSet();
da.Fill(myDS);
t.Commit();
conn.Close();
myDS.WriteXml("out.xml");
Это работает, но я не совсем понимаю, как. Во-первых, я не нашел refcursor в возвращаемых типах диалогового окна функции Create pgAdmin (это синоним чего-то еще?). Во-вторых, мне все еще не удается получить вывод строки в pgAdmin из функции:
SELECT * FROM GetProduct();
работает не так, как ожидалось :).
В-третьих: эта «функция» работает так же, как и SP SQL Server (компилируется, выполняется быстрее и т. Д.)? Или все же это всего лишь обходной путь для получения почти такого же поведения?
И последнее, но не менее важное - есть ли хорошее руководство по миграции с SQL Server?
UPDATE
Дальнейшее изучение проблемы. Похоже, что в MgSQL SP есть прямой эквивалент в pgSQL, но вместо этого вы можете использовать функции. Итак, еще один вопрос: разумно ли использовать функции pgSQL вместо SP? Насколько я понимаю, мой запрос возвращает какой-то курсор в виде пожарного шланга. Я почти никогда не использовал курсоры в MSSQL и знаю, что делать это не рекомендуется, так как это очень неэффективно? Или это какой-то другой тип курсора, который мы имеем здесь в виду?