Объясните хранимые процедуры PostgreSQL - PullRequest
0 голосов
/ 17 мая 2011

Я просто не могу понять их (работаю с 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 и знаю, что делать это не рекомендуется, так как это очень неэффективно? Или это какой-то другой тип курсора, который мы имеем здесь в виду?

1 Ответ

2 голосов
/ 17 мая 2011

Вы можете написать такую ​​функцию.

create function GetProduct() 
returns setof Product as 
  'select * from "Product";' 
language 'sql';

И вы можете получить его результаты, как это.

select * from GetProduct();

Если ваша функция не возвращает никаких данных, вызывайте ее следующим образом.

select procedure_name(arg1, arg2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...