> For the complete documentation index, see [llms.txt](https://support.powerio.com/hub/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://support.powerio.com/hub/codesys-hvac/mysql-library/beispiele/string-grossen-und-lange-sql-befehle.md).

# String-Größen und lange SQL-Befehle

#### Standard-Einschränkungen

Die MySQL-Library arbeitet mit **Arrays** zur Erstellung von SQL-Befehlen

Strings haben eine feste Maximallänge. Durch die Array-Aufteilung können längere Befehle erstellt werden.

### Globale Konstanten anpassen

Diese Werte können Sie in den **Global Constants** ändern:

#### Wo finde ich die Einstellungen?

```iecst
// In den GLOBAL CONSTANTS der Library:
gc_MySQL_iStatementMax    : INT := 10;      // Array-Größe (0..10 = 11 Elemente)
gc_MySQL_iStatementLength : INT := 100;     // Zeichen pro Element
```

#### Beispiel: Größere Befehle ermöglichen

```iecst
// Standard (Default):
gc_MySQL_iStatementMax    := 10;      // 11 Teile
gc_MySQL_iStatementLength := 100;     // 100 Zeichen/Teil


// Erweitert für längere Befehle:
gc_MySQL_iStatementMax    := 20;      // 21 Teile
gc_MySQL_iStatementLength := 200;     // 200 Zeichen/Teil

```

### **Lange SQL Befehle**

#### Strategie 1: Befehl aufteilen (Standard)

**Beispiel:** Langer INSERT mit vielen Werten

```iecst
VAR
    arrLongCmd : ARRAY[0..10] OF STRING(100);
END_VAR

// Teil 1: INSERT-Anfang
arrLongCmd[0] := 'INSERT INTO machine_data (id, timestamp, temp, pressure, speed, status, operator) ';

// Teil 2: VALUES-Anfang
arrLongCmd[1] := 'VALUES (';

// Teil 3-8: Einzelne Werte
arrLongCmd[2] := CONCAT(INT_TO_STRING(iMachineID), ', ');
arrLongCmd[3] := '$272024-01-15 10:30:00$27, ';
arrLongCmd[4] := CONCAT(REAL_TO_STRING(rTemp), ', ');
arrLongCmd[5] := CONCAT(REAL_TO_STRING(rPressure), ', ');
arrLongCmd[6] := CONCAT(REAL_TO_STRING(rSpeed), ', $27');
arrLongCmd[7] := CONCAT(sStatus, '$27, $27');
arrLongCmd[8] := CONCAT(sOperator, '$27)');

// Rest leer lassen
arrLongCmd[9] := '';
arrLongCmd[10] := '';
```

**Wichtig:** Jedes Element darf maximal 100 Zeichen haben!

#### Strategie 2: Zwischenvariablen verwenden

Wenn ein Teil-String zu lang wird:

```iecst
VAR
    sValuesPart1 : STRING(100);
    sValuesPart2 : STRING(100);
END_VAR

// Werte in Zwischenvariablen zusammenbauen
sValuesPart1 := CONCAT(INT_TO_STRING(iValue1), ', ');
sValuesPart1 := CONCAT(sValuesPart1, INT_TO_STRING(iValue2));
sValuesPart1 := CONCAT(sValuesPart1, ', ');
sValuesPart1 := CONCAT(sValuesPart1, INT_TO_STRING(iValue3));

sValuesPart2 := CONCAT(', ', REAL_TO_STRING(rValue4));
sValuesPart2 := CONCAT(sValuesPart2, ', ');
sValuesPart2 := CONCAT(sValuesPart2, REAL_TO_STRING(rValue5));

// Dann in Array einfügen
arrLongCmd[0] := 'INSERT INTO data (v1, v2, v3, v4, v5) VALUES (';
arrLongCmd[1] := sValuesPart1;
arrLongCmd[2] := sValuesPart2;
arrLongCmd[3] := ')';
```

### Praktische Beispiele

#### Beispiel 1: INSERT mit vielen Spalten

**Aufgabe:** 15 Werte in Datenbank schreiben

```iecst
VAR
    // Daten
    iID           : INT := 1;
    sName         : STRING(50) := 'Maschine A';
    rTemp1        : REAL := 23.5;
    rTemp2        : REAL := 24.1;
    rTemp3        : REAL := 22.8;
    rPressure1    : REAL := 1.5;
    rPressure2    : REAL := 1.6;
    rSpeed1       : REAL := 1500.0;
    rSpeed2       : REAL := 1520.0;
    sOperator     : STRING(30) := 'Schmidt';
    sShift        : STRING(10) := 'Frühschicht';
    iCounter      : INT := 1234;
    xAlarm        : BOOL := FALSE;
    sStatus       : STRING(20) := 'RUNNING';
    sLocation     : STRING(30) := 'Halle 3';
    
    // SQL-Befehl
    arrInsertCmd  : ARRAY[0..10] OF STRING(100);
END_VAR

// INSERT aufbauen in kleinen Teilen
arrInsertCmd[0] := 'INSERT INTO machines (id, name, temp1, temp2, temp3, pressure1, pressure2) ';
arrInsertCmd[1] := 'VALUES (';
arrInsertCmd[2] := CONCAT(INT_TO_STRING(iID), ', $27');
arrInsertCmd[3] := CONCAT(sName, '$27, ');
arrInsertCmd[4] := CONCAT(REAL_TO_STRING(rTemp1), ', ');
arrInsertCmd[5] := CONCAT(REAL_TO_STRING(rTemp2), ', ');
arrInsertCmd[6] := CONCAT(REAL_TO_STRING(rTemp3), ', ');
arrInsertCmd[7] := CONCAT(REAL_TO_STRING(rPressure1), ', ');
arrInsertCmd[8] := CONCAT(REAL_TO_STRING(rPressure2), ')');
```

**Aber:** Nur 7 von 15 Werten passen! **Lösung:** Zweiter INSERT oder UPDATE

```iecst
// Zweiter Teil als UPDATE
arrUpdateCmd[0] := 'UPDATE machines SET speed1 = ';
arrUpdateCmd[1] := CONCAT(REAL_TO_STRING(rSpeed1), ', speed2 = ');
arrUpdateCmd[2] := CONCAT(REAL_TO_STRING(rSpeed2), ', operator = $27');
arrUpdateCmd[3] := CONCAT(sOperator, '$27, shift = $27');
arrUpdateCmd[4] := CONCAT(sShift, '$27, counter = ');
arrUpdateCmd[5] := CONCAT(INT_TO_STRING(iCounter), ', status = $27');
arrUpdateCmd[6] := CONCAT(sStatus, '$27 WHERE id = ');
arrUpdateCmd[7] := INT_TO_STRING(iID);
```

***

#### Beispiel 2: SELECT mit langer WHERE-Bedingung

```iecst
VAR
    dtStart : STRING := '2024-01-01';
    dtEnd   : STRING := '2024-12-31';
    rMinTemp: REAL := 20.0;
    rMaxTemp: REAL := 30.0;
    iMachID : INT := 1;
END_VAR

// Lange WHERE-Bedingung aufteilen
arrSelectCmd[0] := 'SELECT * FROM measurements WHERE ';
arrSelectCmd[1] := 'machine_id = ';
arrSelectCmd[2] := CONCAT(INT_TO_STRING(iMachID), ' AND ');
arrSelectCmd[3] := 'timestamp BETWEEN $27';
arrSelectCmd[4] := CONCAT(dtStart, '$27 AND $27');
arrSelectCmd[5] := CONCAT(dtEnd, '$27 AND ');
arrSelectCmd[6] := 'temperature BETWEEN ';
arrSelectCmd[7] := CONCAT(REAL_TO_STRING(rMinTemp), ' AND ');
arrSelectCmd[8] := REAL_TO_STRING(rMaxTemp);
```

***

#### Beispiel 3: UPDATE mit vielen Feldern

```iecst
// Problem: 10 Felder aktualisieren
// Lösung: In sinnvolle Teile aufteilen

arrUpdateCmd[0] := 'UPDATE production SET ';
arrUpdateCmd[1] := 'temp1=' + REAL_TO_STRING(rTemp1) + ', ';
arrUpdateCmd[2] := 'temp2=' + REAL_TO_STRING(rTemp2) + ', ';
arrUpdateCmd[3] := 'temp3=' + REAL_TO_STRING(rTemp3) + ', ';
arrUpdateCmd[4] := 'pressure1=' + REAL_TO_STRING(rPress1) + ', ';
arrUpdateCmd[5] := 'pressure2=' + REAL_TO_STRING(rPress2) + ', ';
arrUpdateCmd[6] := 'speed=' + REAL_TO_STRING(rSpeed) + ', ';
arrUpdateCmd[7] := 'status=$27' + sStatus + '$27 ';
arrUpdateCmd[8] := 'WHERE id = ' + INT_TO_STRING(iID);
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://support.powerio.com/hub/codesys-hvac/mysql-library/beispiele/string-grossen-und-lange-sql-befehle.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
