powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FireBird, таблица из процедуры
25 сообщений из 34, страница 1 из 2
FireBird, таблица из процедуры
    #38649184
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Раньше писал на T-SQL, сейчас немного приходится на FB. Возник вопрос по возврату таблиц из хп.

1. Как я понял, для возврата таблицы надо использовать конструкцию FOR SELECT fld FROM tab INTO :out_var DO SUSPEND; Является ли такая конструкция курсором, с соответствующей просадкой по производительности? Если да - то есть ли быстрый способ вернуть таблицу?

2. Можно ли как в T-SQL вернуть несколько таблиц из хп.? Или как-то ещё организовать возвращаемые данные, например, как в T-SQL: отдельно - набор таблиц, отдельно - message.
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649203
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13th,

Первое что необходимо для успешной работы с FB, так это мыслить категориями MSSQL.

1. Таблицу вернуть нельзя никак. Нету табличных переменных
2. В FB курсор быстрый по сравнению с курсором MSSQL
3. Несколько наборов данных возвращать нельзя. Можно конечно извернуться, но придётся описать столбцы из всех запросов да ещё добавлять некий выходной параметр для описания к какому набору принадлежит запись. Короче ну его нафиг.

На самом деле лучше бы ты описал что делаешь. Попытка сделать как в MSSQL или просто конвертнуть базу скорее всего окажется неудачной
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649250
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисПервое что необходимо для успешной работы с FB, так это мыслить категориями MSSQL.
Хм.
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649267
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мда... хотел написать перестать мыслить
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649282
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис13th,
Первое что необходимо для успешной работы с FB, так это мыслить категориями MSSQL.


Наверное, " перестать мыслить категориями MSSQL" (:

Симонов Денис13th,
На самом деле лучше бы ты описал что делаешь. Попытка сделать как в MSSQL или просто конвертнуть базу скорее всего окажется неудачной

Базу не конвертирую. T-SQL был лет 5 назад.
1. Просто надо кое-что подправить в простенькой базе.
2. Хотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп. Некоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп.
3. Хотелось бы выборки нескольких таблиц свести к одному вызову процедуры, но если нельзя, специально извращаться не буду.
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649287
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис13th,
Первое что необходимо для успешной работы с FB, так это НЕ мыслить категориями MSSQL.

звиняй, влез и поправил
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649295
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,
тормоз я однако , пока две буквы написал, они стали не актуальны
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649303
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13th2. Хотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп. Некоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп.
3. Хотелось бы выборки нескольких таблиц свести к одному вызову процедуры, но если нельзя, специально извращаться не буду.
По п.2 - FB прекрасно возвращает из XP наборы данных
по п.3 - не совсем понятно такое желание
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649304
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thНекоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп.

если наборы выходных параметров совместимы по количеству, типам и размерам, то в принципе можно что типа такого

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE PROCEDURE P(ATYPE INT)
RETURNS (
  P1 INT,
  P2 INT,
  P3 INT
)
AS
BEGIN
  IF (ATYPE = 1) THEN
    FOR SELECT F1, F2, NULL
          FROM T1
          INTO :P1, P2, P3
    DO SUSPEND;

  IF (ATYPE = 2) THEN
    FOR SELECT NULL, NULL, F1
          FROM T2
          INTO :P1, P2, P3
    DO SUSPEND;
END



но тут конечно надо смотреть над тем чтобы логика процедуры оставалась прозрачной
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649307
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thХотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп.
Расхоти, ибо геморрой и бесперспективняк. Есть более простые способы "убрать SQL-выражения
из кода" чем тупое их запихивание в процедуры. Хотя бы потому, что в коде при этом всё
равно остаются SQL-выражения вызовов процедур.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649311
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thХотелось бы выборки нескольких таблиц свести к одному вызову процедуры
А для этого вообще-то существуют JOIN и UNION...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649394
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov13thХотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп.
Расхоти, ибо геморрой и бесперспективняк. Есть более простые способы "убрать SQL-выражения
из кода" чем тупое их запихивание в процедуры. Хотя бы потому, что в коде при этом всё
равно остаются SQL-выражения вызовов процедур.


Ну, при работе с MS SQL это как раз, очень облегчало работу. Поменял процедуру - не надо пересобирать приложение. Не понимаю, почему это "бесперспективняк" в IB. Опять же - отладить процедуру куда проще, чем какой-то текст, который из c++ надо преобразовать в sql, непонятно как насунуть параметры , потом - обратно в c++. Куда проще написать exec myproc.

Dimitry SibiryakovЕсть более простые способы "убрать SQL-выражения из кода" чем тупое их запихивание в процедуры.

Ну так поделись, чо. Я ж затем и пишу, что бы не наступать на давно исхоженные грабли. И сразу сказал, что я с другой платформы.
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649398
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov13thХотелось бы выборки нескольких таблиц свести к одному вызову процедуры
А для этого вообще-то существуют JOIN и UNION...

Имелась ввиду не выборка таблицы с join-ом справочника, а когда при инициализации приложения загружается несколько справочников. Их никак не объединишь, только в разных таблицах возвращать.
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649403
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис13thНекоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп.

если наборы выходных параметров совместимы по количеству, типам и размерам, то в принципе можно что типа такого

но тут конечно надо смотреть над тем чтобы логика процедуры оставалась прозрачной

Не, речь идёт об однородных данных, таких извратов не надо (:
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649407
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thИмелась ввиду не выборка таблицы с join-ом справочника, а когда при
инициализации приложения загружается несколько справочников. Их никак не объединишь,
только в разных таблицах возвращать.
Ну, во-первых, загружать справочники при старте приложения идея тухлая сама по себе.
Пользы мало, а запуск приложения замедляется до невозможности.
Во-вторых, желание делать это одним запросом ещё хуже пованивает.

Не хочешь видеть запросы в коде - загружай их из ресурсов, внешних файлов или той же базы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649408
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7mПо п.2 - FB прекрасно возвращает из XP наборы данных

Это прочёл, там нет ответа на мои вопросы.
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649421
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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++ кода, и перевести всё на хп. Некоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп. "
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649427
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovНу, во-первых, загружать справочники при старте приложения идея тухлая сама по себе.

несколько опрометчивое утверждение.

Dimitry SibiryakovПользы мало, а запуск приложения замедляется до невозможности.

дружище, ты говоришь так, как будто уже провёл замеры, сколько мой приклад запускается с загрузкой справочников, а сколько - без.

Dimitry SibiryakovВо-вторых, желание делать это одним запросом ещё хуже пованивает.

беспочвенные утверждения - вот что пованивает.

Dimitry SibiryakovНе хочешь видеть запросы в коде - загружай их из ресурсов, внешних файлов или той же базы.

Ну, у тебя-то, наверное, вся программа в одном исходнике, ресурсами ты не пользуешься, все диалоги и курсоры создаются динамически, все строки захардкодены вместе с sql-выражениями, а изоляция модулей - нулевая. Текстовый редактор у тебя работает в режиме ядра, а пишешь ты прям сразу в машинных кодах. Мне до тебя ещё далеко!
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649434
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7m
а это что .. не есть ответ на

"2. Хотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп. Некоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп. "

Не, изначально я спросил: "Является ли такая конструкция курсором, с соответствующей просадкой по производительности? Если да - то есть ли быстрый способ вернуть таблицу?"

Фраза "вот и думаю, как их вернуть из хп." означает, не то, что я не знаю как вернуть, а то, что я не уверен, что этот путь наименее затратный. Прошу прощенья, если не достаточно внятно выразился.
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649439
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thдружище, ты говоришь так, как будто уже провёл замеры, сколько мой приклад
запускается с загрузкой справочников, а сколько - без.
Это абсолютно пох. Любое действие длиной дольше ноля секунд при загрузке программы
удлиняет загрузку программы. Это физика, её не обойдёшь.

Ты лучше расскажи нам, милое дитя, как ты борешься с неактуальностью загруженных при
старте программы справочников?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649442
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thя спросил: "Является ли такая конструкция курсором, с соответствующей просадкой
по производительности?
Это вопрос класса "вы уже перестали линчевать негров?". Тормозные курсоры это
исключительная особенность MS SQL. Ни у кого другого курсоры не тормозят.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38649456
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thm7mа это что .. не есть ответ на

"2. Хотелось бы все SQL-выражение убрать из C++ кода, и перевести всё на хп. Некоторые выражения подразумевают табличную выдачу данных, более одной строки, вот и думаю, как их вернуть из хп. "

Не, изначально я спросил: "Является ли такая конструкция курсором, с соответствующей просадкой по производительности? Если да - то есть ли быстрый способ вернуть таблицу?"

Фраза "вот и думаю, как их вернуть из хп." означает, не то, что я не знаю кнет прямых вызовов ак вернуть, а то, что я не уверен, что этот путь наименее затратный. Прошу прощенья, если не достаточно внятно выразился.

Честно говоря не задумывался о "просадке по производительности" из-за использования процедур,
мое мнение, на фоне всего остального, понижение скорости из-за использования процедур незаметно
невооруженным глазом.

зы. для справки.
В программе практически всё вызывается через процедуры.
описание диалогов, форм, отчетов,.... (с соответствующими привязками к процедурам) загружаются из базы
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38663269
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если выборка посложнее, чем select * from sometable, то ХП вполне нормальное решение. Попытка сэкономить на количестве ХП - разве что экономия будет действительно значительной, либо если условия выборки из разных справочников довольно сложные, но однотипные (группируем одинаковый код в одном месте).

Что касается возврата таблицы вкупе с сообщением: можно записывать мессагу в переменные сессии (rdb$setcontext), а потом отдельной ХП их извлекать.
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38664084
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-BrutalЕсли выборка посложнее, чем select * from sometable, то ХП вполне нормальное решение. Попытка сэкономить на количестве ХП - разве что экономия будет действительно значительной, либо если условия выборки из разных справочников довольно сложные, но однотипные (группируем одинаковый код в одном месте).

Что касается возврата таблицы вкупе с сообщением: можно записывать мессагу в переменные сессии (rdb$setcontext), а потом отдельной ХП их извлекать.

какую только чушь не берутся советовать "специалисты"
выборки следует делать только с помощью ХП, если позволяет субд. запомнить это и просто следовать этому правилу
...
Рейтинг: 0 / 0
FireBird, таблица из процедуры
    #38664090
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaratIsk> выборки следует делать только с помощью ХП

А также вставать с правой ноги и носить строго малиновые штаны, да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FireBird, таблица из процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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