MySQL нужа подсказка
Автор |
Повідомлення |
Повідомлення створено: 17. 10. 2013 [13:35]
|
monia
Олег Намятов
Автор теми
Зареєстрован(а) с: 21.05.2012
Повідомлення: 173
|
вот код запроса
using Special.FLibSYS;
req1 = "CREATE TABLE IF NOT EXISTS `" + NameTable + "` ("
+ "`MrkrPckg` BOOL NOT NULL,"
+ "`Time` DATETIME NOT NULL,"
+ "`Val` FLOAT NOT NULL,"
+ "UNIQUE KEY `Time` (`Time`)"
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8;";
req2 = "INSERT INTO `" + NameTable + "` (`MrkrPckg`, `Time`, `Val`) VALUES (" + MrkrPckg + ", FROM_UNIXTIME(" + int2str(Time - TimeZone * 3600,10) + "), "+ real2str(Value,1,"f") +")";
req = req1 + req2;
rez = dbReqSQL("MySQL.ArchAnalogs", req);
SQL запрос (req) проверил в phMyAdmin, он работает как надо, а вот в OpenSCADA не выполняется
может что то не то в последней строчке?
заранее спасибо
|
Повідомлення створено: 17. 10. 2013 [15:33]
|
monia
Олег Намятов
Автор теми
Зареєстрован(а) с: 21.05.2012
Повідомлення: 173
|
вроде как получилось выполнить запрос, а точнее выполнить два отдельных запроса:
1) проверка на существования и создания таблицы
2) добавление параметров в таблицу
Вопрос
А можно ли эти действия объединить в один запрос?
как я хотел
|
Повідомлення створено: 17. 10. 2013 [18:33]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"monia" wrote:
А можно ли эти действия объединить в один запрос?
как я хотел
Нельзя. Функция MySQL API mysql_real_query() по умолчанию не обрабатывает группы запросов.
Хотя это включить и можно, однако обработка результата станет сложнее.
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 08. 11. 2013 [10:52]
|
monia
Олег Намятов
Автор теми
Зареєстрован(а) с: 21.05.2012
Повідомлення: 173
|
Доброе время суток
У меня тут встала вот такая проблем
из лога
4|/SRV/sub_DAQ/mod_JavaLikeCalc/lib_sys_compile/fnc_sub_DAQ_tmplb_11_shub_tmpl_shab_SumParam/ | Исчерпано время вычисления функции 1383891354 > 1383891343+10
3|/SRV/sub_DAQ/mod_JavaLikeCalc/lib_sys_compile/fnc_sub_DAQ_tmplb_11_shub_tmpl_shab_SumParam/ | Выполнение функции прервано ошибкой
3|/SRV/sub_DAQ/mod_ModBus/cntr_11_cp/prm_11_SumParam/ | Ошибка вычисления шаблона.
часть кода шаблона (shab_SumParam - Максимальное время выполнения шаблона 10с), из-за которого возникает такая ошибка
if(f_ChngAnalogs) //Если аналоговые параметры изменились
{
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_EA", 1, vTimeZone, pvTimeAnalog, pT_EA);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_prKK", 1, vTimeZone, pvTimeAnalog, pT_prKK);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_obrKK", 1, vTimeZone, pvTimeAnalog, pT_obrKK);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_prKO", 1, vTimeZone, pvTimeAnalog, pT_prKO);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_obrKOv1", 1, vTimeZone, pvTimeAnalog, pT_obrKOv1);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_obrKOv2", 1, vTimeZone, pvTimeAnalog, pT_obrKOv2);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_obrKOv3", 1, vTimeZone, pvTimeAnalog, pT_obrKOv3);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_obrKOv4", 1, vTimeZone, pvTimeAnalog, pT_obrKOv4);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_prKGVS", 1, vTimeZone, pvTimeAnalog, pT_prKGVS);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_obrKGVSv1", 1, vTimeZone, pvTimeAnalog, pT_obrKGVSv1);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_obrKGVSv2", 1, vTimeZone, pvTimeAnalog, pT_obrKGVSv2);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_obrKGVSv3", 1, vTimeZone, pvTimeAnalog, pT_obrKGVSv3);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_T_obrKCTPv1", 1, vTimeZone, pvTimeAnalog, pT_obrKCTPv1);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_P_prKK", 1, vTimeZone, pvTimeAnalog, pP_prKK);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_P_obrKK", 1, vTimeZone, pvTimeAnalog, pP_obrKK);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_P_prKO", 1, vTimeZone, pvTimeAnalog, pP_prKO);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_P_obrKOv1", 1, vTimeZone, pvTimeAnalog, pP_obrKOv1);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_P_obrKOv2", 1, vTimeZone, pvTimeAnalog, pP_obrKOv2);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_P_obrKOv3", 1, vTimeZone, pvTimeAnalog, pP_obrKOv3);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_P_obrKOv4", 1, vTimeZone, pvTimeAnalog, pP_obrKOv4);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_P_prKGVS", 1, vTimeZone, pvTimeAnalog, pP_prKGVS);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_P_obrKGVS", 1, vTimeZone, pvTimeAnalog, pP_obrKGVS);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_P_obrKCTPv1", 1, vTimeZone, pvTimeAnalog, pP_obrKCTPv1);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_V1fA", 1, vTimeZone, pvTimeAnalog, pV1fA);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_V1fB", 1, vTimeZone, pvTimeAnalog, pV1fB);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_V1fC", 1, vTimeZone, pvTimeAnalog, pV1fC);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_V2fA", 1, vTimeZone, pvTimeAnalog, pV2fA);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_V2fB", 1, vTimeZone, pvTimeAnalog, pV2fB);
SYS.DAQ.JavaLikeCalc.lib_Fun_SQL_DB.Fun_Add_T_INT("MySQL.ArchAnalogs", "011_V2fC", 1, vTimeZone, pvTimeAnalog, pV2fC);
}
f_ChngAnalogs = false;
код функции Fun_Add_T_INT (Простой запрос на добавление параметров в БД)
using Special.FLibSYS;
if(Time > 0)
{
req2 = "INSERT INTO " + NameTable + " (MrkrPckg, Time, Val) VALUES (" + MrkrPckg + ", FROM_UNIXTIME(" + int2str(Time - TimeZone * 3600,10) + "), "+ int2str(Value,10) +")";
rez = dbReqSQL(NameDB, req2);
}
Таким образом в БД должны заноситься параметры с 94 объектов (всего параметров 1132)
Проверил БД, вроде все параметры заносятся в базу, но с пробелами (из - за выше указанной ошибки).
Вроде запрос не сложный и выполняться должен влет.
В какую сторону мне идти?
1) оптимизировать код шаблона (шаблон используется ModBus, для приема входящих парметров)
2) Добавлять в БД параметры по отдельности из своего шаблона (к примеру на логическом уровне, где параметры обрабатываются)
3) ковырять настройки MySQL
Если такая ошибка возникает, функция успевает завершиться или она вылетает по прерыванию?
|
Повідомлення створено: 08. 11. 2013 [13:46]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"monia" wrote:
код функции Fun_Add_T_INT (Простой запрос на добавление параметров в БД)
using Special.FLibSYS;
if(Time > 0)
{
req2 = "INSERT INTO " + NameTable + " (MrkrPckg, Time, Val) VALUES (" + MrkrPckg + ", FROM_UNIXTIME(" + int2str(Time - TimeZone * 3600,10) + "), "+ int2str(Value,10) +")";
rez = dbReqSQL(NameDB, req2);
}
Зачем создавать отдельную функцию если она по сложности сопоставима с её вызовом? Вызывайте прямо "dbReqSQL", а лучше SYS.BD.MySQL.GenDB.SQLReq(), предварительно сохранив объект БД:
dbO = SYS.BD.MySQL.ArchAnalogs;
dbO.SQLReq("INSERT INTO ...");
dbO.SQLReq("INSERT INTO ...");
dbO.SQLReq("INSERT INTO ...");
"monia" wrote:
1) оптимизировать код шаблона (шаблон используется ModBus, для приема входящих парметров)
2) Добавлять в БД параметры по отдельности из своего шаблона (к примеру на логическом уровне, где параметры обрабатываются)
3) ковырять настройки MySQL
Убрать внешнюю команду, а затем на одном-паре запросов оценить время запроса. А вообще MySQL это сетевая БД и на её производительность ещё и сеть может влиять!
"monia" wrote:
Если такая ошибка возникает, функция успевает завершиться или она вылетает по прерыванию?
Нет, конечно. На то она и прерывается по таймауту безопасности, чтобы не висеть.
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 11. 11. 2013 [06:58]
|
monia
Олег Намятов
Автор теми
Зареєстрован(а) с: 21.05.2012
Повідомлення: 173
|
А можно ли сделать вот таким образом?
dbO.SQLReq("INSERT INTO ...", NULL, true); // как я понял 2 параметры возвращаемая таблица, а 3 параметр выполнение запроса с созданием транзакции
dbO.SQLReq("INSERT INTO ...", NULL, true);
dbO.SQLReq("INSERT INTO ...", NULL, true);
dbO.SQLReq("INSERT INTO ...", NULL, true);
transCloseCheck( ); //для закрытия транзакций
Этим я хотел создать транзакцию для добавления записей в InnoDB, после чего ее закрыть.
В идеале хотелось бы получить вот такой запрос
START TRANSACTION;
INSERT INTO ...;
INSERT INTO ...;
INSERT INTO ...;
COMMIT;
|
Повідомлення створено: 11. 11. 2013 [11:07]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"monia" wrote:
А можно ли сделать вот таким образом?
dbO.SQLReq("INSERT INTO ...", NULL, true); // как я понял 2 параметры возвращаемая таблица, а 3 параметр выполнение запроса с созданием транзакции
dbO.SQLReq("INSERT INTO ...", NULL, true);
dbO.SQLReq("INSERT INTO ...", NULL, true);
dbO.SQLReq("INSERT INTO ...", NULL, true);
transCloseCheck( ); //для закрытия транзакций
Только без NULL, ибо тут результат возвращается.
Закрыть транзакцию можно пустым запросом:
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 11. 11. 2013 [11:35]
|
monia
Олег Намятов
Автор теми
Зареєстрован(а) с: 21.05.2012
Повідомлення: 173
|
А с каждым
dbO.SQLReq("INSERT INTO ...", true);
dbO.SQLReq("INSERT INTO ...", true);
dbO.SQLReq("INSERT INTO ...", true);
dbO.SQLReq("",false);
будет создаваться отдельная транзакция или создаться одна транзакция и в ней выполниться блок запросов?
Я просто клоню к тому что мне нужно создать 1 транзакцию и в ней выполнить до 30 запросов после чего ее закрыть
|
Повідомлення створено: 11. 11. 2013 [11:44]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"monia" wrote:
будет создаваться отдельная транзакция или создаться одна транзакция и в ней выполниться блок запросов?
Если никто не вклинится со чтением то будет одна. Второй аргумент это не открытие транзакции, а признак запрашивать в транзакции, за ней или всёравно. Т.е. если транзакция уже открыта, а аргумент "true", то с транзакциями он ничего делать не будет.
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 11. 11. 2013 [12:05]
|
monia
Олег Намятов
Автор теми
Зареєстрован(а) с: 21.05.2012
Повідомлення: 173
|
Рома я извиняюсь
все таки можно создать транзакцию и в ней блок запросов? или нет
|
|
|