EnglishУкраїнськаmRussian
Login/New
Topic with many replies

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


| 1 | 2 | Last
Author Message
Written on: 17. 10. 2013 [13:35]
monia
Олег Намятов
Topic creator
registered since: 21.05.2012
Posts: 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 не выполняется

может что то не то в последней строчке?

заранее спасибо
Written on: 17. 10. 2013 [15:33]
monia
Олег Намятов
Topic creator
registered since: 21.05.2012
Posts: 173
вроде как получилось выполнить запрос, а точнее выполнить два отдельных запроса:
1) проверка на существования и создания таблицы
2) добавление параметров в таблицу

Вопрос
А можно ли эти действия объединить в один запрос?
как я хотел
Written on: 17. 10. 2013 [18:33]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"monia" wrote:

А можно ли эти действия объединить в один запрос?
как я хотел

Нельзя. Функция MySQL API mysql_real_query() по умолчанию не обрабатывает группы запросов.
Хотя это включить и можно, однако обработка результата станет сложнее.

Learn, learn and learn better than work, work and work.
Written on: 08. 11. 2013 [10:52]
monia
Олег Намятов
Topic creator
registered since: 21.05.2012
Posts: 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

Если такая ошибка возникает, функция успевает завершиться или она вылетает по прерыванию?


Written on: 08. 11. 2013 [13:46]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 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.
Written on: 11. 11. 2013 [06:58]
monia
Олег Намятов
Topic creator
registered since: 21.05.2012
Posts: 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;
Written on: 11. 11. 2013 [11:07]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 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.
Written on: 11. 11. 2013 [11:35]
monia
Олег Намятов
Topic creator
registered since: 21.05.2012
Posts: 173
А с каждым
JAVASCRIPT
dbO.SQLReq("INSERT INTO ...", true);
dbO.SQLReq("INSERT INTO ...", true);
dbO.SQLReq("INSERT INTO ...", true);
dbO.SQLReq("",false);

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

Я просто клоню к тому что мне нужно создать 1 транзакцию и в ней выполнить до 30 запросов после чего ее закрыть
Written on: 11. 11. 2013 [11:44]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"monia" wrote:

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

Если никто не вклинится со чтением то будет одна. Второй аргумент это не открытие транзакции, а признак запрашивать в транзакции, за ней или всёравно. Т.е. если транзакция уже открыта, а аргумент "true", то с транзакциями он ничего делать не будет.

Learn, learn and learn better than work, work and work.
Written on: 11. 11. 2013 [12:05]
monia
Олег Намятов
Topic creator
registered since: 21.05.2012
Posts: 173
Рома я извиняюсь
все таки можно создать транзакцию и в ней блок запросов? или нет
| 1 | 2 | Last



3922