# 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 ```