Показано с 1 по 9 из 9

Тема: MYSQL + СПК110, вставка переменных в запрос к БД

  1. #1

    Question MYSQL + СПК110, вставка переменных в запрос к БД

    Добрый день. Есть пример запроса, подскажите, как можно реализовать вставку переменных в запрос?
    И как быть если требуется в БД записывать сразу много строк (10-20)?

    'INSERT INTO new_table (name, time, value) values ("переменная1, "переменная2, "переменная3")'

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,171

    По умолчанию

    Цитата Сообщение от bdw11@mt-holding.ru Посмотреть сообщение
    Добрый день. Есть пример запроса, подскажите, как можно реализовать вставку переменных в запрос?
    И как быть если требуется в БД записывать сразу много строк (10-20)?

    'INSERT INTO new_table (name, time, value) values ("переменная1, "переменная2, "переменная3")'
    Добрый день.
    Насколько я понимаю - пример работы с MySQL вы уже нашли, и теперь у вас только частные вопросы.

    как можно реализовать вставку переменных в запрос?
    Например, так (с использованием функции ReplaceSubstring из библиотеки OwenStringUtils):

    Код:
    PROGRAM PLC_PRG
    VAR
        sVar1:                      STRING := 'переменная1';
        sVar2:                      STRING := 'переменная2';
        sVar3:                      STRING := 'переменная3';
        
        sSqlStatement:              STRING(255);
    END_VAR
    VAR CONSTANT
        c_sSqlStatementTemplate:    STRING(255) := 'INSERT INTO new_table (name, time, value) values ("#VAR1#", "#VAR2#", "#VAR3#")';    
    END_VAR
    
    
    // этот код лучше выполнять только в нужный момент по событию
    
    sSqlStatement := OSU.ReplaceSubstring(c_sSqlStatementTemplate,  '#VAR1#',  sVar1);
    sSqlStatement := OSU.ReplaceSubstring(sSqlStatement,            '#VAR2#',  sVar2);
    sSqlStatement := OSU.ReplaceSubstring(sSqlStatement,            '#VAR3#',  sVar3);
    2022-03-15_6-28-42.png

    И как быть если требуется в БД записывать сразу много строк (10-20)?
    Можно в операторе INSERT указать несколько наборов значений:
    https://www.mysqltutorial.org/mysql-...multiple-rows/

    В некоторых случаях будет эффективнее использовать оператор LOAD DATA INFILE (особенно если есть задача архивировать эти данные и в ПЛК):
    http://www.mysql.ru/docs/man/LOAD_DATA.html

  3. #3

    По умолчанию

    А как в sVar1-sVar3 передать именно значение переменной?, с остальным вроде бы разобрался. При таком объявлении 'переменная1' превращается просто в строку

    sVar1: STRING := 'переменная1';
    sVar2: STRING := 'переменная2';
    sVar3: STRING := 'переменная3';
    Последний раз редактировалось bdw11@mt-holding.ru; 15.03.2022 в 16:33.

  4. #4
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,171

    По умолчанию

    Цитата Сообщение от bdw11@mt-holding.ru Посмотреть сообщение
    А как в sVar1-sVar3 передать именно значение переменной?, с остальным вроде бы разобрался. При таком объявлении 'переменная1' превращается просто в строку

    sVar1: STRING := 'переменная1';
    sVar2: STRING := 'переменная2';
    sVar3: STRING := 'переменная3';
    Приведите пример данных, которые вы хотите записать в БД.
    Они ведь уже существуют в вашей программе в виде переменных?
    Тогда просто покажите их объявление.

  5. #5

    По умолчанию

    Спасибо за помощь, разобрался вроде, поправьте если есть косяки.

    В главной программе объявил 3 переменные с датчиков температуры "temp_in".
    В ФБ для использования MySQL-клиента объявил 3 input переменные "sVar"
    Помощью TO_STRING в главной программе преобразовал "temp_in1" в STRING и адресовал в переменную "sVar1" ФБ для использования MySQL-клиента.

    Код:
    PROGRAM PLC_PRG
    VAR
    	temp_in1:			REAL; //датчик температуры 1
    	temp_in2:			REAL; //датчик температуры 2
    	temp_in3:			REAL; //датчик температуры 3
    
    END_VAR
    1.png

    Код:
    FUNCTION_BLOCK MySQL_CLIENT
    
    VAR_INPUT
    	sVar1:				STRING;
            sVar2:				STRING;
    	sVar3:				STRING;
    END_VAR
    
    
    VAR CONSTANT
    	c_sSqlStatement:		STRING(255) := 'INSERT INTO new_table (name, time, value) values ("#VAR1#", "#VAR2#", "#VAR3#")'; 
    END_VAR
    Код:
    fbRiseEdge(CLK := xExecute);
    
    IF fbRiseEdge.Q THEN
    	sSqlStatement := OSU.ReplaceSubstring(c_sSqlStatement,          '#VAR1#',  sVar1);
       	sSqlStatement := OSU.ReplaceSubstring(sSqlStatement,            '#VAR2#',  sVar2);
       	sSqlStatement := OSU.ReplaceSubstring(sSqlStatement,            '#VAR3#',  sVar3);
    END_IF

  6. #6

  7. #7

    По умолчанию

    Спасибо за помощь

  8. #8

    По умолчанию

    Столкнулся со следующей проблемой. STRING ограничен 255 символами, склеил нескольких строк в одну с помощью OSU.StrConcatA и поместил в sCommand: STRING(500), в результате получилась такой запрос:
    Код:
    mysql -s -utest -p11 -h 10.33.1.101 --database=test --default-character-set=cp1251 -e "INSERT INTO new_table (date, time, value) values (CURRENT_DATE(), CURRENT_TIME(), 24.42029), (CURRENT_DATE(), CURRENT_TIME(), 19.95781), (CURRENT_DATE(), CURRENT_TIME(), 22.24042)"
    который MYSQL отказывается почему то принимать. В БД ничего не приходит.

    Может быть есть способ сформировать адекватный запрос в БД?
    Задача состоит в том, чтобы раз в 1 сек зафиксировать показания датчиков ~20шт (sVar1-sVarn), приклеить метку времени и передать это все в БД.
    На данный момент имею вот такой код:
    Код:
    FUNCTION_BLOCK MySQL_CLIENT
    
    VAR_INPUT
    	xExecute:					BOOL;
    	sUser:						STRING(30);
    	sPassword:					STRING(30);
    	sIpAddr:					STRING(30);
    	sDatabase:					STRING(30);
    	sVar1:                      STRING(30);
        	sVar2:                      STRING(30);
    	sVar3:                      STRING(30);
    END_VAR
    
    VAR_OUTPUT
    	xDone:						BOOL;
    	xBusy:						BOOL;
    	xError:						BOOL;
    	asResult:					ARRAY [1..255] OF STRING(255);
    	usiCountOfStrings:				USINT;
    	xOverFlow:					BOOL;
    END_VAR
    
    VAR
    	sCommand:		STRING(500);
    	fbSe4:		 	CmpSysExec.SysExecute4;
    	fbRiseEdge:		R_TRIG;
    END_VAR
    
    VAR CONSTANT
    	c_sCommand:			STRING(255):= 'mysql -s -u#USER# -p#PASS# -h #HOST# --database=#DATABASE# --default-character-set=cp1251 -e ';
    END_VAR
    Код:
    fbRiseEdge(CLK := xExecute);
    
    IF fbRiseEdge.Q THEN
    	sCommand := OSU.ReplaceSubstring(c_sCommand, '#USER#', 		sUser);
    	sCommand := OSU.ReplaceSubstring(sCommand,   '#PASS#', 		sPassword);
    	sCommand := OSU.ReplaceSubstring(sCommand,   '#HOST#',  	sIpAddr);
    	sCommand := OSU.ReplaceSubstring(sCommand,   '#DATABASE#', 	sDatabase);
    	
    	OSU.StrConcatA(ADR('"INSERT INTO new_table (date, time, value) values (CURRENT_DATE(), CURRENT_TIME(), '), ADR(sCommand), SIZEOF(sCommand));
    	OSU.StrConcatA(ADR(sVar1), ADR(sCommand), SIZEOF(sCommand));
    	OSU.StrConcatA(ADR('), '), ADR(sCommand), SIZEOF(sCommand));
    	OSU.StrConcatA(ADR('(CURRENT_DATE(), CURRENT_TIME(), '), ADR(sCommand), SIZEOF(sCommand));
    	OSU.StrConcatA(ADR(sVar2), ADR(sCommand), SIZEOF(sCommand));
    	OSU.StrConcatA(ADR('), '), ADR(sCommand), SIZEOF(sCommand));
    	OSU.StrConcatA(ADR('(CURRENT_DATE(), CURRENT_TIME(), '), ADR(sCommand), SIZEOF(sCommand));
    	OSU.StrConcatA(ADR(sVar3), ADR(sCommand), SIZEOF(sCommand));
    	OSU.StrConcatA(ADR(')"'), ADR(sCommand), SIZEOF(sCommand));
    END_IF
    
    fbSe4
    (
    	xExecute 	:= fbRiseEdge.Q,
    	sCommand 	:= sCommand,
    	sOutput  	=> asResult,
    	cntReadStr  => usiCountOfStrings,
    	xOverFlow   => xOverFlow,
    	xDone       => xDone,
    	xBusy       => xBusy,
    	xError      => xError
    );

  9. #9

Похожие темы

  1. МастерСкада и MySQL
    от Сергей_К в разделе Master SCADA 3
    Ответов: 57
    Последнее сообщение: 12.03.2024, 14:04
  2. Вставка библиотечного объекта
    от petr2off в разделе ПЛК (среда MasterSCADA 4D)
    Ответов: 1
    Последнее сообщение: 27.01.2022, 15:46
  3. БД MYSQL
    от Holm в разделе СПК1хх [М01]
    Ответов: 2
    Последнее сообщение: 17.05.2021, 09:55
  4. MasterScada4D + MySQL
    от for_kav в разделе Master SCADA 4D
    Ответов: 5
    Последнее сообщение: 22.04.2021, 14:39
  5. Работа с MySQL
    от Александер2008 в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 18.02.2012, 19:30

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •