Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Wladimir Гость
|
Добавлено: Ср Сен 01 2004 14:19 Заголовок сообщения: MsSql: переменное число параметров для хранимой процедуры? |
|
|
Hi, All!
Как в MsSql одним махом записать в рамках хранимой процедуры
элемент ведущей таблицы и переменное число соответствующих ему элементов подчинённой (напр. сч-фактура и строки товаров)?
Хранимой процедуре передаются сразу все данные по счёт-фактуре,
транзакция открывается/закрывается внутри этой процедуры.
Вся работа - строго через хранимые процедуры,
"прямые" команды начать/записать/закончить из программы не катят.
Процедур с переменным числом параметров в MsSql, насколько я знаю, нет.
Знает ли кто-нибудь другой способ, чем слепить все переменные параметры в строку, а потом отпарсить её циклом в теле хранимой процедуры?
Thanx, All! |
|
Вернуться к началу |
|
|
Andy-C
Зарегистрирован: 09.12.2003 Сообщения: 73 Откуда: Нальчик
|
Добавлено: Ср Сен 01 2004 16:53 Заголовок сообщения: Re: MsSql: переменное число параметров для хранимой процедур |
|
|
А смысл
ОВСФ (Основной Вопрос Славянской Филологии): нах? _________________ До 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. |
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Чт Сен 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 Заголовок сообщения: |
|
|
Извиняюсь, я тоже. |
|
Вернуться к началу |
|
|
Andy-C
Зарегистрирован: 09.12.2003 Сообщения: 73 Откуда: Нальчик
|
Добавлено: Пт Сен 03 2004 16:57 Заголовок сообщения: |
|
|
ВСЁ ЭТО ИМХО!!!!!!!
Лучше 10 раз завести простенькие запросы, чем 1 раз наколоться и потом не найдёшь где.
Парсинг весчь хорошая, но здесь это от лукавого. Только усложняет всё.
Получается:
1 правильно сочинить параметры
2 правильно (ну хотяб синтаксически) их запихпть в контейнер
3 парсинг
4 проверка на адекватность предметной области.
5 делаем чего надо.
Против:
1 сочинить параметры.
2 проверить на соответсявие прредметной области.
3 делать чего-надо.
С учётом обработки ошибок на каждом этапе получается огромный пипец
(Пример не совсем адекватен, но показателен)
Один знакомец любит собирать запросы в скриптах и кормить ими сервак. Неделю парил мне мозг, что MS SQL не понимает чисел с плавающей точкой или понимает их ч/з анус...
Оказалась что он накололся в values с запятыми и кавычками
А счёт-фактуру всяко кашерно в одной транзакции писать.
И подтверждать или откатывать должен решать клиент (большой кнопкой "принять".
И тогда ни чего фатального не произойдёт при обрыве коннекта... _________________ До 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].
Он проверяет визуально то, что ввёл, и подтверждает,
когда нажимает большую кнопку "Сохранить". :)
Дальше - уже не его, а мой участок. Дальше у него нет критериев для принятия решений. |
|
Вернуться к началу |
|
|
|