edu-senex/edu/content/cheatsheets/sql-cheatsheet.md

2,7 KiB

SQL in Omnis Cheat Sheet

Verbindung aufbauen

# 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

# 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

Do lStmt.$execdirect(con( |
  'INSERT INTO mytable (name, status, created, revisor, valid) ', |
  'VALUES (@[lName], @[lStatus], now(), @[tEmployeeID], true)' |
  )) Returns #F

UPDATE - Daten aendern

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!)

# In Solution2: Soft-Delete bevorzugen!
Do lStmt.$execdirect(con( |
  'UPDATE orders SET valid = false, modtime = now(), revisor = @[tEmployeeID] ', |
  'WHERE orderid = @[lOrderID]' |
  )) Returns #F

Transaktionen

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

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