Príklad práce s databázou (akcie SQL_ ...)

Príklad práce s databázou (akcie SQL_ ...)

V príklade sa predpokladá existencia objektu SD.StrojVyrabal a je definované DSN na databázu Database potrebnej štruktúry. Ďalej musí byť spustený proces D2000 DBManager s menom SELF.DBM.

Štruktúra databázy:

Tabuľky:

Meno tabuľky

Štruktúra tabuľky

Stroje

Meno stĺpca

Typ

Popis

ID

Integer

Jednoznačný identifikátor stroja

Meno

Char(50)

Meno stroja

Vyrobky

Meno stĺpca

Typ

Popis

ID

Integer

Jednoznačný identifikátor výrobku

Meno

Char(50)

Meno výrobku

StrojVyrabal

Meno stĺpca

Typ

Popis

ID_STROJ

Integer

Jednoznačný identifikátor stroja

ID_VYROBOK

Integer

Jednoznačný identifikátor výrobku

V tabuľke Stroje je evidencia strojov, pričom stroj je reprezentovaný jednoznačným identifikátorom Stroj.ID a ľubovolným menom Stroj.Meno. V tabuľke Vyrobky je evidencia druhov výrobkov, pričom výrobok je reprezentovaný jednoznačným identifikátorom Vyrobok.ID a ľubovolným menom Vyrobok.Meno. V tabuľke StrojVyrabal je evidencia o tom, že stroj StrojVyrabal.ID_STROJ vyrábal výrobok StrojVyrabal.ID_VYROBOK.

Príklad najprv naplní tabuľky Stroj a Vyrobok. Potom náhodne generuje záznamy o vyrábaní výrobkov na strojoch.

Následne zisťuje 3-mi rôznymi spôsobmi, aké výrobky a množstvá sa vyrobili na stroji 1.

INT _handle ; handle na databázu INT _retCode ; návratový kód ; Procedúra vykoná SQL príkaz. Neúspech zaznamená do Monitorovacej databázy PROCEDURE ExecSql(IN TEXT _sql) TEXT _errorMsg SQL_EXEC_DIRECT _handle, _retCode, _sql IF _retCode # _ERR_NO_ERROR THEN _errorMsg := &"Error SQL_EXEC_DIRECT "; + _sql LOG _errorMsg PRIORITY _LOG_PRTY_ERROR ENDIF END ExecSql ; Vloží do tabuľky definíciu stroja PROCEDURE Vloz_Stroj(IN INT _id, IN TEXT _meno) TEXT _sql _sql := "INSERT INTO Stroje VALUES (" + %IToStr(_id) + ", '" + _meno + "')" CALL ExecSql(_sql) END Vloz_Stroj ; Vloží do tabuľky definíciu výrobku PROCEDURE Vloz_Vyrobok(IN INT _id, IN TEXT _meno) TEXT _sql _sql := "INSERT INTO Vyrobky VALUES (" + %IToStr(_id) + ", '" + _meno + "')" CALL ExecSql(_sql) END Vloz_Vyrobok ; Naplním tabuľku Strojov PROCEDURE Napln_Stroje INT _id TEXT _meno TEXT _sql _sql := "DELETE FROM STROJE" CALL ExecSql(_sql) _id := 1 _meno := "Stroj 1" CALL Vloz_Stroj(_id, _meno) _id := 2 _meno := "Stroj 2" CALL Vloz_Stroj(_id, _meno) _id := 3 _meno := "Stroj 3" CALL Vloz_Stroj(_id, _meno) _id := 4 _meno := "Stroj 4" CALL Vloz_Stroj(_id, _meno) _id := 5 _meno := "Stroj 5" CALL Vloz_Stroj(_id, _meno) END Napln_Stroje ; Naplním tabuľku Výrobkov PROCEDURE Napln_Vyrobky INT _id TEXT _meno TEXT _sql _sql := "DELETE FROM VYROBKY" CALL ExecSql(_sql) _id := 1 _meno := "Vyrobok 1" CALL Vloz_Vyrobok(_id, _meno) _id := 2 _meno := "Vyrobok 2" CALL Vloz_Vyrobok(_id, _meno) _id := 3 _meno := "Vyrobok 3" CALL Vloz_Vyrobok(_id, _meno) _id := 4 _meno := "Vyrobok 4" CALL Vloz_Vyrobok(_id, _meno) _id := 5 _meno := "Vyrobok 5" CALL Vloz_Vyrobok(_id, _meno) END Napln_Vyrobky ; Vloží do tabuľky záznam o tom, že stroj vyrábal výrobok PROCEDURE StrojVyrabal(IN INT _idStroj, IN INT _idVyrobok) TEXT _sql _sql := "INSERT INTO StrojVyrabal VALUES (" + %IToStr(_idStroj) + ", " + %IToStr(_idVyrobok) + ")" CALL ExecSql(_sql) END StrojVyrabal ; Procedúra generuje náhodné záznamy o tom, ; že stroj vyrábal výrobok PROCEDURE Napln_StrojVyrabal INT _idStroj INT _idVyrobok INT _idx TEXT _sql _sql := "DELETE FROM StrojVyrabal" CALL ExecSql(_sql) _idx := 1 DO_LOOP EXIT_LOOP _idx = 100 _idStroj := %Rnd() * 4.0 + 1.0 _idVyrobok := %Rnd() * 4.0 + 1.0 CALL StrojVyrabal(_idStroj, _idVyrobok) _idx := _idx + 1 END_LOOP END Napln_StrojVyrabal ; Zoznam výrobkov a ich počet pre stroj s menom "Stroj 1" ; prostredníctvom SQL_PREPARE - verzia 1 alebo 4 PROCEDURE Stroj_1_LocVarList BOOL _useBinding = @TRUE ; pouzit SQL_BINDIN? TEXT _sql TEXT _errorMsg TEXT _vyrobok INT _pocet IF _useBinding THEN ; alternativa s SQL_BINDIN (verzia 4) _sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = #PAR# " _sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno" SQL_PREPARE _handle, _retCode, _sql BINDOUT _vyrobok, _pocet SQL_BINDIN _handle, _retCode, "Stroj 1" ; nastav hodnotu vstupneho parametra ELSE ; alternativa bez SQL_BINDIN (verzia 1) _sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = 'Stroj 1' " _sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno" SQL_PREPARE _handle, _retCode, _sql BIND _vyrobok, _pocet ENDIF IF _retCode # _ERR_NO_ERROR THEN _errorMsg := "Error SQL_PREPARE " + _sql LOG _errorMsg PRIORITY _LOG_PRTY_ERROR RETURN ENDIF DO_LOOP SQL_FETCH _handle, _retCode ; načítanie 1 riadku výsledku SQL príkazu SELECT do premenných _vyrobok a _pocet EXIT_LOOP _retCode # _ERR_NO_ERROR END_LOOP END Stroj_1_LocVarList ; Zoznam výrobkov a ich počet pre stroj s menom "Stroj 1" ; prostredníctvom SQL_PREPARE - verzia 2 alebo 5 PROCEDURE Stroj_1_LocRowIdent BOOL _useBinding = @TRUE ; pouzit SQL_BINDIN? TEXT _par = "Stroj 1" ; hodnota parametra TEXT _sql TEXT _errorMsg RECORD NOALIAS (SD.StrojVyrabal) _vyrabal IF _useBinding THEN ; alternativa s SQL_BINDIN (verzia 5) _sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = #PAR# " _sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno" SQL_PREPARE _handle, _retCode, _sql BINDOUT _vyrabal[1] SQL_BINDIN _handle, _retCode, _par ; nastav hodnotu vstupneho parametra ELSE ; alternativa bez SQL_BINDIN (verzia 2) _sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = 'Stroj 1' " _sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno" SQL_PREPARE _handle, _retCode, _sql BIND _vyrabal[1] ENDIF IF _retCode # _ERR_NO_ERROR THEN _errorMsg := "Error SQL_PREPARE " + _sql LOG _errorMsg PRIORITY _LOG_PRTY_ERROR RETURN ENDIF DO_LOOP SQL_FETCH _handle, _retCode ; načítanie 1 riadku výsledku SQL príkazu SELECT do riadku č.1 premennej _vyrabal EXIT_LOOP _retCode # _ERR_NO_ERROR END_LOOP END Stroj_1_LocRowIdent ; Zoznam výrobkov a ich počet pre stroj s menom "Stroj 1" ; prostredníctvom SQL_PREPARE - verzia 3 a 6 PROCEDURE Stroj_1_LocRecIdent BOOL _useBinding = @TRUE ; pouzit SQL_BINDIN? TEXT _par = "Stroj 1" ; hodnota parametra TEXT _sql TEXT _errorMsg INT _maxRows RECORD NOALIAS (SD.StrojVyrabal) _vyrabal IF _useBinding THEN ; alternativa s SQL_BINDIN (verzia 6) _sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = #PAR# " _sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno" SQL_PREPARE _handle, _retCode, _sql BINDOUT _vyrabal SQL_BINDIN _handle, _retCode, _par ; nastav hodnotu vstupneho parametra ELSE ; alternativa bez SQL_BINDIN (verzia 3) _sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = 'Stroj 1' " _sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno" SQL_PREPARE _handle, _retCode, _sql BIND _vyrabal ENDIF IF _retCode # _ERR_NO_ERROR THEN _errorMsg := "Error SQL_PREPARE " + _sql LOG _errorMsg PRIORITY _LOG_PRTY_ERROR RETURN ENDIF _maxRows := 10 DO_LOOP SQL_FETCH _handle, _retCode, _maxRows ; načítanie maximálne 10 riadkov výsledku SQL príkazu SELECT do premennej _vyrabal EXIT_LOOP _retCode # _ERR_NO_ERROR END_LOOP END Stroj_1_LocRecIdent BEGIN ; Napojím sa na databázu SQL_CONNECT "UID=dba;PWD=sql;DSN=Database", _handle, _retCode ON SELF.DBM IF _retCode # _ERR_NO_ERROR THEN LOG "Chyba pri konektovaní databázy" PRIORITY _LOG_PRTY_ERROR END ENDIF ; Naplním Tabuľku Stroje CALL Napln_Stroje ; Naplním Tabuľku Vyrobky CALL Napln_Vyrobky ; Naplním Tabuľku StrojVyrabal CALL Napln_StrojVyrabal ; Zistím, aké výrobky vyrábal "Stroj 1" CALL Stroj_1_LocVarList ; Zistím, aké výrobky vyrábal "Stroj 1" CALL Stroj_1_LocRowIdent ; Zistím, aké výrobky vyrábal "Stroj 1" CALL Stroj_1_LocRecIdent END

Poznámka
Pri ukončení skriptu akciou END (alebo iným ľubovoľným spôsobom), sú automaticky zatvorené všetky spojenia s databázou.

Súvisiace stránky:

Akcie v skriptoch