104 Zeilen
2,7 KiB
Markdown
104 Zeilen
2,7 KiB
Markdown
# SQL in Omnis Cheat Sheet
|
|
|
|
## Verbindung aufbauen
|
|
```omnis
|
|
# Session-Objekt erstellen (im IDE: Variable lSess vom Typ Object)
|
|
Do lSess.$logon('localhost', 'postgres', 'passwort', 'meineSess') Returns #F
|
|
If flag true
|
|
# Verbunden!
|
|
End If
|
|
```
|
|
|
|
## SELECT - Daten lesen
|
|
```omnis
|
|
# SICHER mit Bind-Variablen (:1, :2)
|
|
Do lStmt.$prepare('SELECT * FROM contact WHERE companyid = :1 AND valid = :2') Returns #F
|
|
Do lStmt.$execute(lCompanyID, kTrue) Returns #F
|
|
Do lStmt.$fetch(lList, kFetchAll) Returns #F
|
|
|
|
# Alternative: @[]-Syntax (auch sicher)
|
|
Do lStmt.$execdirect('SELECT * FROM orders WHERE orderid = @[lOrderID]') Returns #F
|
|
Do lStmt.$fetch(lList, kFetchAll) Returns #F
|
|
```
|
|
|
|
## INSERT - Daten einfuegen
|
|
```omnis
|
|
Do lStmt.$execdirect(con( |
|
|
'INSERT INTO mytable (name, status, created, revisor, valid) ', |
|
|
'VALUES (@[lName], @[lStatus], now(), @[tEmployeeID], true)' |
|
|
)) Returns #F
|
|
```
|
|
|
|
## UPDATE - Daten aendern
|
|
```omnis
|
|
Do lStmt.$prepare(con( |
|
|
'UPDATE orders SET status = :1, modtime = now(), revisor = :2 ', |
|
|
'WHERE orderid = :3' |
|
|
)) Returns #F
|
|
Do lStmt.$execute(lNewStatus, tEmployeeID, lOrderID) Returns #F
|
|
```
|
|
|
|
## DELETE - Daten loeschen (VORSICHT!)
|
|
```omnis
|
|
# In Solution2: Soft-Delete bevorzugen!
|
|
Do lStmt.$execdirect(con( |
|
|
'UPDATE orders SET valid = false, modtime = now(), revisor = @[tEmployeeID] ', |
|
|
'WHERE orderid = @[lOrderID]' |
|
|
)) Returns #F
|
|
```
|
|
|
|
## Transaktionen
|
|
```omnis
|
|
Do lSess.$begin() Returns #F ;; START TRANSACTION
|
|
# ... mehrere SQL-Operationen ...
|
|
If lAllesOK
|
|
Do lSess.$commit() Returns #F ;; COMMIT
|
|
Else
|
|
Do lSess.$rollback() Returns #F ;; ROLLBACK
|
|
End If
|
|
```
|
|
|
|
## Fehlerbehandlung
|
|
```omnis
|
|
Do lStmt.$execute(lParam) Returns #F
|
|
If not(flag true)
|
|
Calculate lError as lSess.$lasterrortext
|
|
OK message {SQL-Fehler: [lError]}
|
|
End If
|
|
```
|
|
|
|
## Fetch-Modi
|
|
```
|
|
kFetchAll -> Alle Zeilen in Liste (fuer kleine/mittlere Ergebnisse)
|
|
kFetchOne -> Eine Zeile (fuer Schleifen bei grossen Ergebnissen)
|
|
kFetchBulk -> Block von N Zeilen (Kompromiss)
|
|
```
|
|
|
|
## WICHTIGE REGELN
|
|
```
|
|
IMMER: @[lVar] oder :1 (Bind-Variablen = SICHER)
|
|
NIE: [lVar] (Text-Substitution = SQL-INJECTION!)
|
|
|
|
IMMER: WHERE valid = true (Soft-Delete beachten!)
|
|
IMMER: modtime, revisor setzen bei UPDATE
|
|
IMMER: created, revisor, valid setzen bei INSERT
|
|
IMMER: #F pruefen nach jedem SQL-Aufruf
|
|
```
|
|
|
|
## Solution2-spezifische SQL-Tipps
|
|
```
|
|
Schema: soluser
|
|
Datenbank: masterdemo
|
|
Engine: PostgreSQL
|
|
|
|
Typische WHERE-Klausel:
|
|
WHERE valid = true
|
|
AND companyid = @[lCompanyID]
|
|
ORDER BY modtime DESC
|
|
|
|
Datum/Zeit:
|
|
now() -> aktueller Timestamp
|
|
current_date -> aktuelles Datum
|
|
@[#D] -> Omnis-Datum als Parameter
|
|
@[#T] -> Omnis-Timestamp als Parameter
|
|
```
|