|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Доброго дня! Вообщем идея такая - есть 2 таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
и Код: sql 1. 2. 3. 4.
Поле EXTINT таблицы LOGS связано с полем ID таблицы EXTSTRING, причем не всегда, чаще всего там пустое значение, также несколько записей из таблицы LOGS могут ссылаться на одну запись из таблицы EXTSTRING. В случае добавления новой записи в таблицу LOGS, с учетом того, что будет связь с таблицей EXTSTRING возникает необходимость совершить следующее: 1. Проверить, имеется ли такая же строка как и входящая в таблице EXTSTRING, если нет, создать ее 2. Вернуть значение ID из таблицы EXTSTRING на нужную строку 3. Добавить новую запись в таблицу LOGS, в котором поле EXTINT равно ID из пункта 2. В соответствии с этим рисую stored proc: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Ну и вопросы: 1. Что-то не то с процедурой. Строка 10 "INTO TID2;" - не нужна, но если ее убрать - ругается на IF (TID IS NULL)..., если оставить - ругается на строку 18 "INTO ID;" - ошибка стандартная: "Token unknown". 2. Получу ли я реально значение генератора, и занесение его в таблицу, как в строках 13, 14? Просто именно это значение мне и нужно вернуть из процедуры. 3. Будет ли работать процедура в таком запросе: Код: sql 1. 2.
Ну вот как-то так... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 09:20 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
BorodaOleg, Перед параметрами в текстах любых запросов надо ставить двоеточие. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 09:38 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Переделал так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Создание процедуры вроде как прокатило, но вот при попытке вызова: Код: sql 1. 2.
получаю ошибку: SQL error code = -804. Function unknown. CHECK_ID_EXTSTR. Бред какой-то... Может ее как то по другому вызывать нужно? Но gen_id прокатывает-то...? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 09:58 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
BorodaOleg, ты процедуру с функцией путаешь. Процедуры вызываются иначе. Или через EXECUTE PROCEDURE или через SELECT ... FROM PROC(...) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 10:04 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
BorodaOleg, Добавь в процедуру suspend и попробуй получить значение из нее при помощи select. Но почему бы тебе и собственнно вставку не переместить внутрь процедуры? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 10:05 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
BorodaOleg, Сервер, кстати, какой версии? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 10:07 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Vlad F, Firebird 2.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 10:10 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
BorodaOleg, Тогда "легким движением" переделать ее на функцию не получится. В тройке было бы проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 10:16 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Vlad F, с одной стороны да, с другой — функции с побочным эффектом bad design ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 10:27 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Симонов Денис, С каким таким побочным эффектом? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 10:38 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Vlad F, У него процедура вставкой еще занимается. В функцию лучше такого не засовывать - по сути ты вызываешь проверку, а вместо простой проверки у тебя еще в разных местах какие-то записи появляются. Неочевидно по прошествии некоторого времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 10:44 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Переделал вот так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
и запрос: Код: sql 1. 2.
И всё заработало!!! Спасибо всем за помощь! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 10:44 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
BorodaOlegПеределал так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Создание процедуры вроде как прокатило, но вот при попытке вызова: Код: sql 1. 2.
получаю ошибку: SQL error code = -804. Function unknown. CHECK_ID_EXTSTR. Бред какой-то... Может ее как то по другому вызывать нужно? Но gen_id прокатывает-то...? Ну как-то вот так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: sql 1. 2.
зы. в процедуру не вникал ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 10:51 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Vlad F, функция не должна менять данные, иначе её применение сильно ограничено. Как минимум это сразу отклоняет использование таких функций в SELECT запросах, ибо пути оптимизатора неисповедимы, а следовательно невозможно заранее предсказать сколько раз будет выполнена функция. А раз она вносит изменения в данные, то невозможно и предсказать какими будут данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 10:51 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
DarkMasterVlad F, У него процедура вставкой еще занимается. В функцию лучше такого не засовывать - по сути ты вызываешь проверку, а вместо простой проверки у тебя еще в разных местах какие-то записи появляются. Неочевидно по прошествии некоторого времени. Чего-чего? Название не нравится? Ну так переобозвать ее на что-то вроде ВставкаСПроверкой и пусть работает очевидным образом. Вы так дойдете до того, что и в ориггерах нельзя в другие таблицы вставлять "в разных местах" ведь тоже другие записи появляются. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 11:05 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Vlad F, не... ты не понял моего объяснения. Я не категорически против таких функций. Но во-первых, как ты правильно заметил, функцию надо правильно назвать. Ибо по дурости её можно в какой нибудь SELECT запихнуть, например Код: sql 1. 2. 3. 4. 5.
сколько раз выполнится CHECK_ID_EXTSTR? Правильный ответ ХЗ. Зависит от количества записей в T1, T2 их распределения и плана который выберет оптимизатор. Кстати к селективным ХП это тоже относится ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 11:13 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Симонов ДенисVlad F, функция не должна менять данные, иначе её применение сильно ограничено. Как минимум это сразу отклоняет использование таких функций в SELECT запросах, ибо пути оптимизатора неисповедимы, а следовательно невозможно заранее предсказать сколько раз будет выполнена функция. А раз она вносит изменения в данные, то невозможно и предсказать какими будут данные. Я имел ввиду троечные функцию, которую можно бало бы топикастеру подставить в инсерт без паразитного селекта. Что выглядело бы как минимум более элегантно, и не думаю, что оптимизатор от этого потерял бы голову.)) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 11:14 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Симонов ДенисVlad F, не... ты не понял моего объяснения. Я не категорически против таких функций. Но во-первых, как ты правильно заметил, функцию надо правильно назвать. Ибо по дурости её можно в какой нибудь SELECT запихнуть, например Код: sql 1. 2. 3. 4. 5.
сколько раз выполнится CHECK_ID_EXTSTR? Правильный ответ ХЗ. Зависит от количества записей в T1, T2 их распределения и плана который выберет оптимизатор. Кстати к селективным ХП это тоже относится Все, я сдаюсь, ибо тебя упорно сносит в сторону какого то селекта, от которого я и предлагал по возможности отказаться.)) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 11:18 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Vlad F, оптимизатор голову и не теряет. А вот логика в таком SELECT запросе крайне сомнительна. Я же говорю как минимум функцию надо правильно назвать, чтобы спустя полгода не воткнуть её туда, где она натворит бед. Да и INSERT тоже разный бывает. Сегодня вставляешь 1 запись, завтра нужно несколько вставить INSERT ... SELECT, послезавтра вообще MERGE потребуется. Где гарантия, что автора не возникнет соблазн перетащить свою функцию в новые запросы. ИХМО, нужна сложная логика записи в лог. Ну так сделать хранимую процедуру которая делает и INSERT INTO LOGS и INSERT INTO extstring с проверками в одной процедуре. И сразу будет ясно что и где делается ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 11:22 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
BorodaOleg, добавлю Код: sql 1. 2. 3. 4.
задание алиаса TID (SELECT ID TID) абсолютно бессмысленно, потому что INTO запишет значение в переменную TID независимо от имени выбираемого столбца. Кроме того, этот код выдаст NULL в TID в двух случаях - когда есть запись с NULL в TID - когда нет записи where str=:extstr И, по логике программирования тут не процедура нужна, а триггер на таблицу LOG. Insert с побочным insert в процедуре, да еще и через select - это жуть какая-то, а не код. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 11:41 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
kdvзадание алиаса TID (SELECT ID TID) абсолютно бессмысленно, потому что INTO запишет значение в переменную TID независимо от имени выбираемого столбца. в простейшем запросе автора да. Однако если запрос сложный с использованием JOIN или выражений в SELECT, я всё равно задаю алиасы, просто потому что так удобно отлаживать отдельно взятый запрос, у которого тупо отпилен INTO ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 11:46 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
Симонов Денис, я сам пишу алиасы. Просто по тексту возникло впечатление, что автор думает, что имя алиаса столбца должно совпадать с именем переменной для into. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 11:48 |
|
Создание/использование хранимых процедур
|
|||
---|---|---|---|
#18+
kdvКроме того, этот код выдаст NULL в TID в двух случаях ... - когда нет записи where str=:extstrНе буквоедства ради, но... в этом случае значение :TID не изменится. А это совсем не то же самое, что присваивание NULL. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 12:02 |
|
|
start [/forum/topic.php?fid=40&msg=39735030&tid=1560899]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 255ms |
0 / 0 |