powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хранимые процедуры. Где они???
20 сообщений из 20, страница 1 из 1
Хранимые процедуры. Где они???
    #35572066
Андрюхец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТОка начал юзать постгрес
создаю хранимую процедуру либо sql ем либо формами грит что создал но я их вообще найти не могу где они лежат в какой ветке уже все просмотрел!
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35572074
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это смотря в чем смотришь....в пладмине это фукции веточка
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35572081
Андрюхец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин капеец точно просто их там так много
ащо 2 вопроса
как она выполняется ну типа execute не работает почемуто
и есть хороший мануал к пладмину
не пинайте сильно ятока начал)
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35572111
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select func(param);
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35572117
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я сам начинающий а пгадмин и так по моему интуитивно понятный по крайней мере у меня вопроса по мануалу к нему не возникало, удачи!
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35572127
Андрюхец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нифига себе интуитивно
всехда хранимки и ms sql выполнялись execute имя процедуры;

будем искать мануалы
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35572147
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну это уже не в пгадмине дело....
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35572179
Андрюхец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ефстественно
все таки у тя есть мануалы по sql посгресовскому
и по пладми или может знаешь где взять?
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35572246
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://]http://www.postgresql.org/docs/8.3/static/
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35572677
бухарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АндрюхецТОка начал юзать постгрес
создаю хранимую процедуру либо sql ем либо формами грит что создал но я их вообще найти не могу где они лежат в какой ветке уже все просмотрел!

поищи в 'public'
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35572997
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне тоже интересен сей вопросец...
Насколько я понял - хранимых процедур в постгрессе нет, а есть тока функции. Как тада для постгресса решается вопрос об исключении возможных инъекций, который в sql server 2005 решается как раз таки хранимками?
Я качнул .NET библы для постгресса, заюзал его провайдера, выполнив команду sql-запроса, но с бд нужно контактировать процедурами с указанием параметров, ежели таковые требуются (во избежания заражения бацилами вплоть до летального исхода), а не прямыми SQL-запросами. Нашел в инете книгу по постгрессу, пролистал функции - сделал вывод, что они работают аналогично функциям MS SQL Server, а это не то, что нужно. По хранимкам ничего... Однако ведь имеется .NET-библиотека для работы с PostgreSQL и в ней ясно видно, что принцип работы с этой субд стандартный, однако я не понял, как создать в постгрессе то, что в MS SQL Server называется хранимой процедурой...
На скорую руку накидал код примера, в котором видим, что принцип один и тот же для любых субд (в примере я указал только две, но можно сколько угодно) обратите внимание на закомментированный код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
        public Company(string connectionString, Providers provider)
        {
            List<string> companyes = new List<string>();
            DbProviderFactory factory;
            switch (provider)
            {
                case Providers.SqlServer:
                    factory = DbProviderFactories.GetFactory("System.Data.SqlClient");
                    break;
                case Providers.PostgreSQL:
                    factory = NpgsqlFactory.Instance;
                    break;
                default:
                    Exception ex = new Exception("Не допустимый провайдер!");
                    throw ex;                    
            }
            using (DbConnection cnn = factory.CreateConnection())
            {
                cnn.ConnectionString = connectionString;
                DbCommand cmd = factory.CreateCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.StoredProcedure;
                DbParameter parametr = factory.CreateParameter();
                parametr.ParameterName = "@ID";
                parametr.DbType = DbType.Int32;
                parametr.Value = 1;
                cmd.Parameters.Add(parametr);
                DbDataReader reader;
                try
                {
                    cnn.Open();
                    reader = cmd.ExecuteReader();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        string company = (string) reader["Name"];
                        companyes.Add(company);
                    }
                }
                reader.Close(); reader.Dispose();
                cnn.Close();
                ///В закомментированном ниже коду видно, что
                ///PostgreSQL может работать с хранимыми процедурами (или чем-то,
                ///что в данной субд их заменяет) - предусмотрено разработчиками 
                ///(алгоритм тот же, что и при работе с SQL Server).
                    
                    //NpgsqlCommand cmd2 = new NpgsqlCommand();
                    //cmd2.CommandType = CommandType.StoredProcedure;
                    //NpgsqlParameter parametr2 = new NpgsqlParameter();
                    //parametr2.DbType = DbType.Int32;
                    //parametr2.ParameterName = "@ID";
                    //parametr2.Value = 1;
                    //cmd2.Parameters.Add(parametr2);
            }
...
        /// <summary>
        /// Провайдеры
        /// </summary>
        public enum Providers
        {
            SqlServer = 0,
            PostgreSQL = 1
        }

____________________________
п.с. пока глубоко не разбирался с этим вопросом, спрашиваю, чтобы иметь начальное общее представление.
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35573709
ЯЕХХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Compositum...вопрос об исключении возможных инъекций, который в sql server 2005 решается как раз таки хранимками?

Перепутали мягкое с тёплым . Для борьбы с иньекциями всюду - и в MSSQL, и в Оракле, и в Постгресе - используют параметризированные запросы . Это защита от злонамеренных пользователей.

Процедуры предназначены в основном для хранения кода на сервере, потому и называются хранимыми. А когда при этом закрывают прямой доступ к таблицам, то это скорее защита от криворуких разработчиков клиентской части получается

Если например вы динамический SQL в процедуре исполнять будете, то чем вам поможет факт того, что процедуру заюзали?

Нашел в инете книгу по постгрессу, пролистал функции - сделал вывод, что они работают аналогично функциям MS SQL Server, а это не то, что нужно.

Неверно! В отличие от MSSQL, в постгресовских можно выполнять любой код, включая DDL. Так что наши функции круче
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35573840
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для тех, кто не знаком с MSSQL, поясните, чем отличается хранимая процедура от функции ?
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35573902
vasos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не знаком, по сути функция возвращающая void есть процедура, ну это в моем понятии так, если это не так плз поправте меня...
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35621331
dvasya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serik AkhmetovДля тех, кто не знаком с MSSQL, поясните, чем отличается хранимая процедура от функции ?

В MSSQL функция - может принимать на вход какие-то параметры, что-то считать, делать селекты к таблицам, и она всегда возвращает какое-то одно значение.
Например, можно написать функцию, переводящую строку 'Иванов Иванов Иванович' в 'Иванов И.И.'

select FIO, GetFamiliyaIO(FIO) as FamiliyaIO
from Users

или функцию, которая по ID документа, возвращает дату его создания.
select ID, GetCreateDate(ID)
from Document


Но функция в MSSQL не может ничего изменять в таблицах.
То есть только что-либо считает и выдает одно(!) значение...

А продура - может принимать на вход какие-то параметры, и может делать все, что хочешь.
апдейтить, инсертить, удалять, создавать таблицы, добавлять индексы, может запускать другие процедуры, возвращать в качетсве результата несколько запросов (типа RecordSet в VB), может на выходе выдавать ReturnValue. Плюс какие-то может изменить значения входящих параметров.

Но процедуру можно только выполнить (Execute)!

exec CreateDocumentAndReturnCreate ID
или
exec @CreateDate = CreateDocumentAndReturnCreate ID

Ее НЕЛЬЗЯ(!) вставить в запрос типа

select ID, CreateDocumentAndReturnCreate(ID)
from Document
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35632151
lexx1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dvasyaSerik AkhmetovДля тех, кто не знаком с MSSQL, поясните, чем отличается хранимая процедура от функции ?

В MSSQL функция - может принимать на вход какие-то параметры, что-то считать, делать селекты к таблицам, и она всегда возвращает какое-то одно значение.
Например, можно написать функцию, переводящую строку 'Иванов Иванов Иванович' в 'Иванов И.И.'

select FIO, GetFamiliyaIO(FIO) as FamiliyaIO
from Users

или функцию, которая по ID документа, возвращает дату его создания.
select ID, GetCreateDate(ID)
from Document


Но функция в MSSQL не может ничего изменять в таблицах.
То есть только что-либо считает и выдает одно(!) значение...
......
Ее НЕЛЬЗЯ(!) вставить в запрос типа

select ID, CreateDocumentAndReturnCreate(ID)
from Document
В 2000 SQL это всё есть.
Писал лично. Вы ошибаетесь.
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35632534
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dvasyaSerik AkhmetovДля тех, кто не знаком с MSSQL, поясните, чем отличается хранимая процедура от функции ?

Но функция в MSSQL не может ничего изменять в таблицах.
То есть только что-либо считает и выдает одно(!) значение...


Не обязательно
Там есть функции возвращающие таблицу
:-)
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35639789
dvasya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mwolfdvasyaSerik AkhmetovДля тех, кто не знаком с MSSQL, поясните, чем отличается хранимая процедура от функции ?

Но функция в MSSQL не может ничего изменять в таблицах.
То есть только что-либо считает и выдает одно(!) значение...


Не обязательно
Там есть функции возвращающие таблицу
:-)

Согласен, функция может вернуть:
либо одно значение типа scalar_data_type,
либо одно значение типа TABLE, в которой может быть сразу целая таблица значений.
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35639843
dvasya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lexx1234dvasyaSerik AkhmetovДля тех, кто не знаком с MSSQL, поясните, чем отличается хранимая процедура от функции ?

В MSSQL функция - может принимать на вход какие-то параметры, что-то считать, делать селекты к таблицам, и она всегда возвращает какое-то одно значение.
Например, можно написать функцию, переводящую строку 'Иванов Иванов Иванович' в 'Иванов И.И.'

select FIO, GetFamiliyaIO(FIO) as FamiliyaIO
from Users

или функцию, которая по ID документа, возвращает дату его создания.
select ID, GetCreateDate(ID)
from Document


Но функция в MSSQL не может ничего изменять в таблицах.
То есть только что-либо считает и выдает одно(!) значение...
......
Ее НЕЛЬЗЯ(!) вставить в запрос типа

select ID, CreateDocumentAndReturnCreate(ID)
from Document
В 2000 SQL это всё есть.
Писал лично. Вы ошибаетесь.

Тут Вы немного неверно сократили мой текст.
Взяв начало описания про функция и окончание описания про процедуру.
Функуция и процедура - совершенно не одно и тоже (к сожалению).

Transact-SQL Reference
The following statements are allowed in the body of a multi-statement function. Statements not in this list are not allowed in the body of a function:

Assignment statements.

Control-of-Flow statements.

DECLARE statements defining data variables and cursors that are local to the function.

SELECT statements containing select lists with expressions that assign values to variables that are local to the function.

Cursor operations referencing local cursors that are declared, opened, closed, and deallocated in the function. Only FETCH statements that assign values to local variables using the INTO clause are allowed; FETCH statements that return data to the client are not allowed.

INSERT, UPDATE, and DELETE statements modifying table variables local to the function.

EXECUTE statements calling an extended stored procedures.


Из этого текста ясно, что к сожалению функция в Transact-SQL не может проводить INSERT, UPDATE, and DELETE statements, которые изменяют не локальные (временные) для этой функции таблицы.
И к сожалению, функция не может вызывать другие хранимые процедуры (extended stored procedures - не считаются, ими пользуется только в очень исключительных случаях).
В ответ на попытку вызвать процедуру из функции MS SQL выдает ошибку:
"Only functions and extended stored procedures can be executed from within a function."

Поэтому я еще не смог написать функцию dbo.fnGenereateNextID(), аналогичную секвенсу SEQ_LOAD.NEXTVAL в ORACLE, которая в селекте для каждой строки возвращала бы новое значение, чтобы использовать его в запросах на массовую вставку типа:

insert into Table1(PrID, PrName)
select dbo.fnGenereateNextID(), PrName
from View1
where PrType = 10

Поэтому пока обхожусь полями типа int IDENTITY (1, 1).

Может кто-то уже написал такую функцию в MS SQL?

PS: может заодно неграмонтному в PostgreSQL расскажете, каким способом в PostgreSQL создается значение для ключевого поля? Сиквенсом или полем типа IDENTITY? Дайте пожалуйста ссылку или конкретный пример.
...
Рейтинг: 0 / 0
Хранимые процедуры. Где они???
    #35643947
Shweik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читайте документацию - там есть и пара образцов написания сишных ХП.
Плюс к этому примеры можно найти порывшись в contrib-e.
Например мне многое подсказали сорцы ./contrib/dblink.
Насчёт последнего - ответ прост :тип SERIAL. Остальное в доке.
P.S
И хватит оффтопить о проблемах/фичах M$SQL. Или не знаем где форум по нему??.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хранимые процедуры. Где они???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]