Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

MsSql: переменное число параметров для хранимой процедуры?

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных
Предыдущая тема :: Следующая тема  
Автор Сообщение
Wladimir
Гость





СообщениеДобавлено: Ср Сен 01 2004 14:19    Заголовок сообщения: MsSql: переменное число параметров для хранимой процедуры? Ответить с цитатой

Hi, All!

Как в MsSql одним махом записать в рамках хранимой процедуры
элемент ведущей таблицы и переменное число соответствующих ему элементов подчинённой (напр. сч-фактура и строки товаров)?

Хранимой процедуре передаются сразу все данные по счёт-фактуре,
транзакция открывается/закрывается внутри этой процедуры.

Вся работа - строго через хранимые процедуры,
"прямые" команды начать/записать/закончить из программы не катят.

Процедур с переменным числом параметров в MsSql, насколько я знаю, нет.

Знает ли кто-нибудь другой способ, чем слепить все переменные параметры в строку, а потом отпарсить её циклом в теле хранимой процедуры?

Thanx, All!
Вернуться к началу
Andy-C



Зарегистрирован: 09.12.2003
Сообщения: 73
Откуда: Нальчик

СообщениеДобавлено: Ср Сен 01 2004 16:53    Заголовок сообщения: Re: MsSql: переменное число параметров для хранимой процедур Ответить с цитатой

А смысл Question Shocked

ОВСФ (Основной Вопрос Славянской Филологии): нах?
_________________
До onlina Andrew C.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Wladimir
Гость





СообщениеДобавлено: Ср Сен 01 2004 20:44    Заголовок сообщения: Re: MsSql: переменное число параметров для хранимой процедур Ответить с цитатой

[quote="Andy-C"]А смысл :?: :shock:

ОВСФ (Основной Вопрос Славянской Филологии): нах?[/quote]

Что именно нах?

Если "нах" через хранимую процедуру:

1) Чтобы не развозить сопли по белому свету, записывая каждую бумажку через двадцать запросов к серверу и цепляя на сервер незакрытые транзакции.
В смысле: послал клиент begin trans, а на commit/rollback
уже сил не хватило :) - ошибка в программе, конец света (в электрощитке), да мало ли.

"Один выстрел - один труп." (c) х/ф "Sniper".

2) Сохраняшки очень хорошо всю логику упорядочивают и порядок в бардаке наводят.

Если вообще "нах", то вопрос: а на фига мне счёт-фактура без строк или строки без счёт-фактуры?

(На самом деле это не счёт-фактура, но на этом примере нагляднее).

Вариант с парсингом строки в настоящее время реально работает,
но хочется знать, как грамотно, а не как приспособился.
Вернуться к началу
wildwind



Зарегистрирован: 03.02.2004
Сообщения: 268
Откуда: Москва

СообщениеДобавлено: Чт Сен 02 2004 11:35    Заголовок сообщения: Ответить с цитатой

Логика в процедурах - это хорошо. А вот commit давать должен клиент IMHO.

Если в ХП есть commit, это ограничивает ее использование: она уже не может быть вызвана как часть другой, более сложной транзакции.

Если клиент умер, не завершив транзакцию, то сервер ее откатит по обрыву коннекта, и все OK.

Если же хочешь сократить число обращений к серверу (что есть правильно), то посылай несколько вызовов ХП в одном скрипте, MSSQL это позволяет. А потом commit.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Гость






СообщениеДобавлено: Чт Сен 02 2004 19:14    Заголовок сообщения: Ответить с цитатой

[quote="wildwind"]
commit давать должен клиент IMHO.
[/quote]
Видимо, это не всегда так.
К примеру, триггеры решают commit/rollback без подсказки клиента.
Хранимые процедуры вроде бы ничем от триггеров принципиально не отличаются.

[quote="wildwind"]
Если в ХП есть commit, это ограничивает ее использование: она уже не может быть вызвана как часть другой, более сложной транзакции.
[/quote]
Извини, но вроде бы вызываются.
По крайней мере, вложенные именованные транзакции.

Т.е. procA
- открывает транзакцию tranA,
- вызывает процедуру procB, внутри которой
вызывается/завершается транзакция tranB.
- если procB отработала без ошибки
(и, соответственно, прошло commit tranB),
- то procA делает commit tranA, а иначе - rollback tranA.

Неименованные тоже не препятствовали, насколько я заметил,
подобным вещам, но там commit/rollback относится к ближайшей транзакции, поэтому от них я сразу отказался.

Впрочем, не знаю как пройдут одноимённые транзакции,
вызванные одновременно несколькими запросами.
В этом отношении да - сомневаюсь. Это - слабое звено.

[quote="wildwind"]
Если клиент умер, не завершив транзакцию, то сервер ее откатит по обрыву коннекта, и все OK.
[/quote]
Буду знать.

[quote="wildwind"]
Если же хочешь сократить число обращений к серверу (что есть правильно), то посылай несколько вызовов ХП в одном скрипте, MSSQL это позволяет. А потом commit.
[/quote]
Да, по-видимому это единственный выход.

Спасибо!
Вернуться к началу
Гость






СообщениеДобавлено: Чт Сен 02 2004 20:53    Заголовок сообщения: Ответить с цитатой

А я не знал про вложенные транзакции и rollback в триггерах. Работаю в основном с Oracle, где вложенные транзакции недопустимы.
Вернуться к началу
Wladimir
Гость





СообщениеДобавлено: Чт Сен 02 2004 21:40    Заголовок сообщения: Ответить с цитатой

Извиняюсь, не подписался: Чт Сен 02 2004 20:14 - моё.

Спасибо!
Вернуться к началу
wildwind



Зарегистрирован: 03.02.2004
Сообщения: 268
Откуда: Москва

СообщениеДобавлено: Пт Сен 03 2004 16:43    Заголовок сообщения: Ответить с цитатой

Извиняюсь, я тоже. Very Happy
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Andy-C



Зарегистрирован: 09.12.2003
Сообщения: 73
Откуда: Нальчик

СообщениеДобавлено: Пт Сен 03 2004 16:57    Заголовок сообщения: Ответить с цитатой

ВСЁ ЭТО ИМХО!!!!!!!

Лучше 10 раз завести простенькие запросы, чем 1 раз наколоться и потом не найдёшь где.

Парсинг весчь хорошая, но здесь это от лукавого. Только усложняет всё.
Получается:
1 правильно сочинить параметры
2 правильно (ну хотяб синтаксически) их запихпть в контейнер
3 парсинг
4 проверка на адекватность предметной области.
5 делаем чего надо.

Против:
1 сочинить параметры.
2 проверить на соответсявие прредметной области.
3 делать чего-надо.

С учётом обработки ошибок на каждом этапе получается огромный пипец Sad

(Пример не совсем адекватен, но показателен)
Один знакомец любит собирать запросы в скриптах и кормить ими сервак. Неделю парил мне мозг, что MS SQL не понимает чисел с плавающей точкой или понимает их ч/з анус... Smile
Оказалась что он накололся в values с запятыми и кавычками Smile

А счёт-фактуру всяко кашерно в одной транзакции писать.
И подтверждать или откатывать должен решать клиент (большой кнопкой "принять"Smile.
И тогда ни чего фатального не произойдёт при обрыве коннекта...
_________________
До onlina Andrew C.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Wladimir
Гость





СообщениеДобавлено: Сб Сен 04 2004 11:17    Заголовок сообщения: Ответить с цитатой

> Лучше 10 раз завести простенькие запросы, чем 1 раз наколоться и потом не найдёшь где.
Каждый из этих простеньких запросов точно также формируется той же программой
совершенно тем же образом.
Имхо, вероятность ошибки совершенно одинаковая.

> Парсинг весчь хорошая, но здесь это от лукавого. Только усложняет всё.
Согласен, оттого и спросил. :)

> С учётом обработки ошибок на каждом этапе получается огромный пипец [Sad]
Ну, огромного пока не было, но концептуально неприятно. :(

<ОФФТОПИК>
> Один знакомец ... парил мне мозг, что MS SQL не понимает чисел
> с плавающей точкой или понимает их ч/з анус... [Smile]
> Оказалась что он накололся в values с запятыми и кавычками [Smile]
Имхо, иногда не понимает :) . Недавно мы два дня втроём над этим долбались...
Функция Round в компании с другими строковыми ну просто изумительно
выделывалась с точностями 2/3/4 после точки.
3 и 4 - нормально, а 2 округлялось как 1.
Причину видим в загадочной трактовке типов промежуточных значений.
Пример дать не смогу, не моя база. :(
</ОФФТОПИК>
Сорри за оффтопик.

> А счёт-фактуру всяко кашерно в одной транзакции писать.
О чём и речь. :)

> И подтверждать или откатывать должен решать клиент (большой кнопкой "принять"[Smile].
Он проверяет визуально то, что ввёл, и подтверждает,
когда нажимает большую кнопку "Сохранить". :)
Дальше - уже не его, а мой участок. Дальше у него нет критериев для принятия решений.
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...