|
|
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
Раньше писал на T-SQL, сейчас немного приходится на FB. Возник вопрос по возврату таблиц из хп. 1. Как я понял, для возврата таблицы надо использовать конструкцию FOR SELECT fld FROM tab INTO :out_var DO SUSPEND; Является ли такая конструкция курсором, с соответствующей просадкой по производительности? Если да - то есть ли быстрый способ вернуть таблицу? 2. Можно ли как в T-SQL вернуть несколько таблиц из хп.? Или как-то ещё организовать возвращаемые данные, например, как в T-SQL: отдельно - набор таблиц, отдельно - message. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 15:49:52 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
13th, Первое что необходимо для успешной работы с FB, так это мыслить категориями MSSQL. 1. Таблицу вернуть нельзя никак. Нету табличных переменных 2. В FB курсор быстрый по сравнению с курсором MSSQL 3. Несколько наборов данных возвращать нельзя. Можно конечно извернуться, но придётся описать столбцы из всех запросов да ещё добавлять некий выходной параметр для описания к какому набору принадлежит запись. Короче ну его нафиг. На самом деле лучше бы ты описал что делаешь. Попытка сделать как в MSSQL или просто конвертнуть базу скорее всего окажется неудачной ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 16:12:14 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисПервое что необходимо для успешной работы с FB, так это мыслить категориями MSSQL. Хм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 16:43:21 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
мда... хотел написать перестать мыслить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 16:48:43 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
Симонов Денис13th, Первое что необходимо для успешной работы с FB, так это мыслить категориями MSSQL. Наверное, " перестать мыслить категориями MSSQL" (: Симонов Денис13th, На самом деле лучше бы ты описал что делаешь. Попытка сделать как в MSSQL или просто конвертнуть базу скорее всего окажется неудачной Базу не конвертирую. T-SQL был лет 5 назад. 1. Просто надо кое-что подправить в простенькой базе. 2. Хотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп. Некоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп. 3. Хотелось бы выборки нескольких таблиц свести к одному вызову процедуры, но если нельзя, специально извращаться не буду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 16:54:54 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
Симонов Денис13th, Первое что необходимо для успешной работы с FB, так это НЕ мыслить категориями MSSQL. звиняй, влез и поправил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 16:56:26 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
m7m, тормоз я однако , пока две буквы написал, они стали не актуальны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 16:59:41 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
13th2. Хотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп. Некоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп. 3. Хотелось бы выборки нескольких таблиц свести к одному вызову процедуры, но если нельзя, специально извращаться не буду. По п.2 - FB прекрасно возвращает из XP наборы данных по п.3 - не совсем понятно такое желание ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 17:04:45 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
13thНекоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп. если наборы выходных параметров совместимы по количеству, типам и размерам, то в принципе можно что типа такого Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. но тут конечно надо смотреть над тем чтобы логика процедуры оставалась прозрачной ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 17:05:56 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
13thХотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп. Расхоти, ибо геморрой и бесперспективняк. Есть более простые способы "убрать SQL-выражения из кода" чем тупое их запихивание в процедуры. Хотя бы потому, что в коде при этом всё равно остаются SQL-выражения вызовов процедур. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 17:07:08 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
13thХотелось бы выборки нескольких таблиц свести к одному вызову процедуры А для этого вообще-то существуют JOIN и UNION... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 17:08:09 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov13thХотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп. Расхоти, ибо геморрой и бесперспективняк. Есть более простые способы "убрать SQL-выражения из кода" чем тупое их запихивание в процедуры. Хотя бы потому, что в коде при этом всё равно остаются SQL-выражения вызовов процедур. Ну, при работе с MS SQL это как раз, очень облегчало работу. Поменял процедуру - не надо пересобирать приложение. Не понимаю, почему это "бесперспективняк" в IB. Опять же - отладить процедуру куда проще, чем какой-то текст, который из c++ надо преобразовать в sql, непонятно как насунуть параметры , потом - обратно в c++. Куда проще написать exec myproc. Dimitry SibiryakovЕсть более простые способы "убрать SQL-выражения из кода" чем тупое их запихивание в процедуры. Ну так поделись, чо. Я ж затем и пишу, что бы не наступать на давно исхоженные грабли. И сразу сказал, что я с другой платформы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 17:59:08 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov13thХотелось бы выборки нескольких таблиц свести к одному вызову процедуры А для этого вообще-то существуют JOIN и UNION... Имелась ввиду не выборка таблицы с join-ом справочника, а когда при инициализации приложения загружается несколько справочников. Их никак не объединишь, только в разных таблицах возвращать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 18:01:05 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
Симонов Денис13thНекоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп. если наборы выходных параметров совместимы по количеству, типам и размерам, то в принципе можно что типа такого но тут конечно надо смотреть над тем чтобы логика процедуры оставалась прозрачной Не, речь идёт об однородных данных, таких извратов не надо (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 18:03:10 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
13thИмелась ввиду не выборка таблицы с join-ом справочника, а когда при инициализации приложения загружается несколько справочников. Их никак не объединишь, только в разных таблицах возвращать. Ну, во-первых, загружать справочники при старте приложения идея тухлая сама по себе. Пользы мало, а запуск приложения замедляется до невозможности. Во-вторых, желание делать это одним запросом ещё хуже пованивает. Не хочешь видеть запросы в коде - загружай их из ресурсов, внешних файлов или той же базы. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 18:05:11 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 18:05:43 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
13thm7mПо п.2 - FB прекрасно возвращает из XP наборы данных Это прочёл, там нет ответа на мои вопросы. а это что длинная цитата из указанной статьи Селективные процедуры Как вы уже видели в предыдущих разделах, процедуры могут возвращать данные. Если использовать execute procedure, то можно получить всегда только одно значение, или как бы "одну строку", в виде набора значений, но не "несколько строк". Процедуры в InterBase и Firebird могут выдавать данные таким образом, что их можно вызывать через select. Отсюда и название - "селективные" процедуры. Пример: create procedure test returns (n varchar(35)) as declare variable ln varchar(20); declare variable fn varchar(15); begin for select last_name, first_name from employee into :ln, :fn do begin n=:fn ||' '|| :ln; suspend; end end Процедура перебирает все записи таблицы employee и возвращает нам "склеенные" имя и фамилию сотрудников. Размер возвращаемой переменной n выбран как сумма размеров столбцов first_name и last_name таблицы empoyee и переменных ln и fn, чтобы во время обработки не возникло переполнения. Ключевым в работе процедуры является указание suspend. В тот момент, когда выполнение процедуры доходит до suspend, сервер останавливает выполнение процедуры, и "ждет", пока клиент не попросит получить данные "из процедуры". После получения данных (одной "записи") сервер прокрутит следующий цикл for select до очередного suspend, и так далее, пока клиент не перестанет просить записи, или пока записи в запросе не кончатся. Если мы вызовем эту процедуру как EXECUTE PROCEDURE TEST то мы получим только первую "запись", и ничего более, т.к. подобный вызов процедуры не предполагает попытки получения последующих значений. Поэтому селективные процедуры нужно вызывать как select * from test IBQuery1.SQL.Clear; IBQuery1.SQL.Add('select * from test'); IBQuery1.Open; Вот тут, как видите мы уже должны использовать Open (а не ExecSQL), чтобы открыть набор записей как обычный запрос. Дальше можно перебирать записи по IBQuery1.Next, или подключить к IBQuery1 DataSource и DBGrid, и т.д. IBStoredProc в этом случае использовать невозможно, т.к. он не умеет вызывать процедуры никаким образом кроме EXECUTE PROCEDURE (т.е. не является DataSet-ом, не смотря на то что унаследован от CustomDataSet). SUSPEND можно использовать не только с for select, но и вообще, если вы хотите выдать данные как "запись". Возьмем процедуру с подсчетом суммы зарплат, и расширим ее create procedure calcsalarysum returns (fn varchar(15), ln varchar(20), sm numeric(15,2)) as declare variable s numeric(15,2); begin sm=0; for select first_name, last_name, salary from employee into :fn, ln, :s do begin sm=:sm+:s; suspend; end fn=''; ln=''; s=:sm; suspend; end; Теперь в процедуре два suspend (выделены жирным шрифтом). Первый "выталкивает" имя, фамилию и зарплату в выходные переменные. Второй - выдает последней "записью" пустые имя и фамилию и итоговую сумму, которая предварительно накоплена пременной sm. Вот еще один вариант селективной процедуры, который вообще не содержит обращений к данным create procedure test returns (i int) as begin i=5; suspend; i=3; suspend; i=9; suspend; end Если выполнить такую процедуру через select * from test, то она вернет 3 записи со значениями 5, 3 и 9. Если процедура не имеет выходных переменных, то suspend использовать нельзя (как минимум, в этом нет смысла). Вызывать селективные процедуры через execute procedure можно, если требуется получить только одно, первое значение. Точно так же можно вызвать селективную процедуру через select * from myproc, и после выборки первой записи закрыть датасет (IBQuery1.Close; не есть ответ на "2. Хотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп. Некоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп. " ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 18:11:41 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНу, во-первых, загружать справочники при старте приложения идея тухлая сама по себе. несколько опрометчивое утверждение. Dimitry SibiryakovПользы мало, а запуск приложения замедляется до невозможности. дружище, ты говоришь так, как будто уже провёл замеры, сколько мой приклад запускается с загрузкой справочников, а сколько - без. Dimitry SibiryakovВо-вторых, желание делать это одним запросом ещё хуже пованивает. беспочвенные утверждения - вот что пованивает. Dimitry SibiryakovНе хочешь видеть запросы в коде - загружай их из ресурсов, внешних файлов или той же базы. Ну, у тебя-то, наверное, вся программа в одном исходнике, ресурсами ты не пользуешься, все диалоги и курсоры создаются динамически, все строки захардкодены вместе с sql-выражениями, а изоляция модулей - нулевая. Текстовый редактор у тебя работает в режиме ядра, а пишешь ты прям сразу в машинных кодах. Мне до тебя ещё далеко! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 18:15:30 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
m7m а это что .. не есть ответ на "2. Хотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп. Некоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп. " Не, изначально я спросил: "Является ли такая конструкция курсором, с соответствующей просадкой по производительности? Если да - то есть ли быстрый способ вернуть таблицу?" Фраза "вот и думаю, как их вернуть из хп." означает, не то, что я не знаю как вернуть, а то, что я не уверен, что этот путь наименее затратный. Прошу прощенья, если не достаточно внятно выразился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 18:19:06 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
13thдружище, ты говоришь так, как будто уже провёл замеры, сколько мой приклад запускается с загрузкой справочников, а сколько - без. Это абсолютно пох. Любое действие длиной дольше ноля секунд при загрузке программы удлиняет загрузку программы. Это физика, её не обойдёшь. Ты лучше расскажи нам, милое дитя, как ты борешься с неактуальностью загруженных при старте программы справочников? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 18:24:07 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
13thя спросил: "Является ли такая конструкция курсором, с соответствующей просадкой по производительности? Это вопрос класса "вы уже перестали линчевать негров?". Тормозные курсоры это исключительная особенность MS SQL. Ни у кого другого курсоры не тормозят. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 18:25:39 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
13thm7mа это что .. не есть ответ на "2. Хотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп. Некоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп. " Не, изначально я спросил: "Является ли такая конструкция курсором, с соответствующей просадкой по производительности? Если да - то есть ли быстрый способ вернуть таблицу?" Фраза "вот и думаю, как их вернуть из хп." означает, не то, что я не знаю кнет прямых вызовов ак вернуть, а то, что я не уверен, что этот путь наименее затратный. Прошу прощенья, если не достаточно внятно выразился. Честно говоря не задумывался о "просадке по производительности" из-за использования процедур, мое мнение, на фоне всего остального, понижение скорости из-за использования процедур незаметно невооруженным глазом. зы. для справки. В программе практически всё вызывается через процедуры. описание диалогов, форм, отчетов,.... (с соответствующими привязками к процедурам) загружаются из базы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2014, 18:36:59 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
Если выборка посложнее, чем select * from sometable, то ХП вполне нормальное решение. Попытка сэкономить на количестве ХП - разве что экономия будет действительно значительной, либо если условия выборки из разных справочников довольно сложные, но однотипные (группируем одинаковый код в одном месте). Что касается возврата таблицы вкупе с сообщением: можно записывать мессагу в переменные сессии (rdb$setcontext), а потом отдельной ХП их извлекать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2014, 10:57:01 |
|
||
|
FireBird, таблица из процедуры
|
|||
|---|---|---|---|
|
#18+
Fr0sT-BrutalЕсли выборка посложнее, чем select * from sometable, то ХП вполне нормальное решение. Попытка сэкономить на количестве ХП - разве что экономия будет действительно значительной, либо если условия выборки из разных справочников довольно сложные, но однотипные (группируем одинаковый код в одном месте). Что касается возврата таблицы вкупе с сообщением: можно записывать мессагу в переменные сессии (rdb$setcontext), а потом отдельной ХП их извлекать. какую только чушь не берутся советовать "специалисты" выборки следует делать только с помощью ХП, если позволяет субд. запомнить это и просто следовать этому правилу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2014, 19:42:52 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38664084&tid=1563526]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
68ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 408ms |

| 0 / 0 |
