УкраїнськаEnglishmRussian
Вхід/Новий
У темі багато повідомлень

MySQL нужа подсказка


Автор Повідомлення
Повідомлення створено: 17. 10. 2013 [13:35]
monia
Олег Намятов
Автор теми
Зареєстрован(а) с: 21.05.2012
Повідомлення: 173
вот код запроса
JAVASCRIPT
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с), из-за которого возникает такая ошибка
JAVASCRIPT
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 (Простой запрос на добавление параметров в БД)
JAVASCRIPT
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 (Простой запрос на добавление параметров в БД)
JAVASCRIPT
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(), предварительно сохранив объект БД:
JAVASCRIPT
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
А можно ли сделать вот таким образом?
JAVASCRIPT
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, после чего ее закрыть.

В идеале хотелось бы получить вот такой запрос
JAVASCRIPT
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:

А можно ли сделать вот таким образом?
JAVASCRIPT
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, ибо тут результат возвращается.
Закрыть транзакцию можно пустым запросом:
JAVASCRIPT
dbO.SQLReq("", false);


Learn, learn and learn better than work, work and work.
Повідомлення створено: 11. 11. 2013 [11:35]
monia
Олег Намятов
Автор теми
Зареєстрован(а) с: 21.05.2012
Повідомлення: 173
А с каждым
JAVASCRIPT
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
Рома я извиняюсь
все таки можно создать транзакцию и в ней блок запросов? или нет



4653