powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Insert результатов работы хранимой процедуры в темповую таблицу
11 сообщений из 11, страница 1 из 1
Insert результатов работы хранимой процедуры в темповую таблицу
    #39368096
aggrosparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, друзья.

Суть проблемы:
В хранимке есть курсор, курсор отрабатывает N-ое кол-во раз, результат каждого select'a выводиться в отдельную "таблицу". Запрос 1, Запрос 2 и так далее.
Когда я вызываю хранимку из Си-шарпного кода, и пытаюсь забрать результаты MySqlDataReader'ом, то получаю результат только из "Запрос1".
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
cmd.CommandText = "CALL zbx.GetPerformanceResults";
	        MySqlDataReader reader = cmd.ExecuteReader();
		while (reader.Read()) {
		for (int i = 0; i < reader.FieldCount; i++) {
			string data = reader.GetValue(i).ToString();
			Console.WriteLine("{0}", data);
			items.Add(data);
	}
}



Вопрос такого харрактера, возможно ли какой-то инструкцией сказать хранимке, что она должна вернуть результат своей работы, что бы я мог засунуть результат её работы в какую то темповую таблицу и уже из неё читать всё. Или есть какой-то другой способ? Ресерч по данной теме навёл только на мысль использования темповой таблицы, но т.к. ХП по дефолту не возвращает никаких значений, использовать конструкцию
Код: sql
1.
CREATE STORED PROCEDURE temptbl AS CALL StoredProcedureName


не получается.

Помогите, пожалуйста, дедлайн близок :D
...
Рейтинг: 0 / 0
Insert результатов работы хранимой процедуры в темповую таблицу
    #39368108
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно как передавать в процедуру требуемое имя (и использовать внутри неё prepared statements), так и наоборот, генерировать такое имя в процедуре и возвращать его через OUT-параметр (тогда наоборот, prepared statement потребуется для работы с результатом). Третий вариант - использовать предопределённое имя, но он подходит только для монопольной среды исполнения. Четвёртый - передавать в процедуру имя статической таблицы, а она в самом конце обработки скопирует туда записи из временной, которую создаст в процессе работы и шлёпнет после копирования. Так что путей решения проблемы дофига (тут перечислены не все).
...
Рейтинг: 0 / 0
Insert результатов работы хранимой процедуры в темповую таблицу
    #39368111
aggrosparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, Передавать в процедуру требуемое имя чего? Не совсем уловил. Можете привести какой-то код для примера?

Что касается статический таблицы, куда временная скопирует результаты после выполнения, Вы наверное не поняли. У меня не получается использовать временную таблицу для моего селекта.

Приведу пример кода:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
OPEN cursorRam;

REPEAT
		FETCH cursorRam into ramItemId;
		IF NOT done THEN
			SELECT history_uint.itemid,round(1782* MOD(CAST(clock AS UNSIGNED)+81756,211093)/(211093),0) AS i,COUNT(*) AS count,AVG((17179869184/value)) AS avg,MIN((17179869184/value)) AS min,MAX((17179869184/value)) AS max,MAX(clock) AS clock 
      FROM history_uint 
      LEFT JOIN items ON history_uint.itemid = items.itemid
      WHERE history_uint.itemid=ramItemId AND FROM_UNIXTIME(clock) >= (DATE_SUB(now(), INTERVAL 1 MINUTE))
      GROUP BY history_uint.itemid,round(1782* MOD(CAST(clock AS UNSIGNED)+81756,211093)/(211093),0)
      order by clock DESC;
		END IF;
		FETCH NEXT FROM cursorRam INTO ramItemId;
UNTIL done END REPEAT;
	CLOSE cursorRam;


Если перед селектом пытаюсь вставить что-то типа
Код: sql
1.
INSERT INTO tempTbl

, то ругается на синтаксис.
...
Рейтинг: 0 / 0
Insert результатов работы хранимой процедуры в темповую таблицу
    #39368114
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aggrosparrow,
хранимки могут и возвращают все запросы , которые в них исполняются
в java такое элементарно делается, должно быть и в си
...
Рейтинг: 0 / 0
Insert результатов работы хранимой процедуры в темповую таблицу
    #39368118
aggrosparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,

while(reader.Read())
заканчивает выполняться после селекта с первым айдишником из курсора.

Наверное я как-то не совсем ясно изложил суть проблемы.
...
Рейтинг: 0 / 0
Insert результатов работы хранимой процедуры в темповую таблицу
    #39368119
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aggrosparrow,
это называется мультирезультсет
...
Рейтинг: 0 / 0
Insert результатов работы хранимой процедуры в темповую таблицу
    #39368120
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aggrosparrow,
нужно прочитать следующий результсет
...
Рейтинг: 0 / 0
Insert результатов работы хранимой процедуры в темповую таблицу
    #39368124
aggrosparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, да, точно. Уже нагуглил. Вроде нашел, то что искал. Сенкс!
...
Рейтинг: 0 / 0
Insert результатов работы хранимой процедуры в темповую таблицу
    #39368125
aggrosparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
взлетело!
Reader.NextResult()
решило все мои проблемы. Стыдпозор.
...
Рейтинг: 0 / 0
Insert результатов работы хранимой процедуры в темповую таблицу
    #39368132
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aggrosparrow,
удачи и дальше!
...
Рейтинг: 0 / 0
Insert результатов работы хранимой процедуры в темповую таблицу
    #39368134
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aggrosparrowПередавать в процедуру требуемое имя чего? Не совсем уловил. Можете привести какой-то код для примера?Да временной таблицы, неужели непонятно? или ты уже успел забыть, о чём спрашивал?

Шаблонно:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create procedure make_and_fill_temptable(in tempname varchar(23), filter text)
as
begin
set @sql = concat('create temp table ',tempname,'(fieldset specification) engine=memory');
prepare stmt from @sql;
exec stmt;
deallocate stmt;
-- do
  set @sql = concat('insert into ',tempname,' (fieldset) select fieldset from sourcetable where ',filter,' and ',anotherfilter,';');
  prepare stmt from @sql;
  exec stmt;
  deallocate stmt;
-- loop
end;

exec make_and_fill_temptable('temptable_1','firstname="Вася" and lastname="Пупкин"');
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Insert результатов работы хранимой процедуры в темповую таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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