SQLStatement (WBIK)

Formßt bloku:

SQLStatement: nßzev_SQL_p°φkazu
°ßdek_SQLStatement_bloku
[EndSQL]

V²znam:

Blok konektoru, podle kterΘho se sestavφ jednotlivΘ SQL p°φkazy, kterΘ budou p°edßny databßzi.

M∙₧ete pou₧φt libovolnΘ SQL p°φkazy WinBase602 SQL Serveru, pouze nßsledujφcφ p°φkazy vÜak majφ praktick² v²znam: SELECT, INSERT INTO, DELETE FROM, UPDATE, CALL.

Do jednoho bloku SQLStatement lze zapsat vφce SQL p°φkaz∙, v tom p°φpad∞ jsou jednotlivΘ p°φkazy od sebe odd∞leny st°ednφkem. Poslednφ SQL p°φkaz v bloku SQLStatement nemusφ konΦit st°ednφkem.

Nßzev_SQL_p°φkazu je slovo z pφsmen, Φφslic a znaku podtr₧enφ ( _ ). V Üablon∞, kterß bude pou₧ita pro sestavenφ HTML dokumentu, se m∙₧ete na tento SQL p°φkaz odkazovat pomocφ jmΘna nßzev_SQL_p°φkazu. Pojmenovat m∙₧ete libovoln² SQL p°φkaz, ale praktick² v²znam mß pouze pojmenovßnφ p°φkazu SELECT. Tφmto pojmenovßnφm mßte nap°. mo₧nost zjistit, kolik zßznam∙ obsahuje odpov∞∩ (nßzev_SQL_p°φkazu.TotalCount), mßte mo₧nost se p°φmo odkazovat na sloupce odpov∞di v detail sekci Üablony atd.

Pokud blok SQLStatement obsahuje vφce SQL p°φkaz∙ a zßrove≥ je pojmenovan², pak se nßzev_SQL_p°φkazu vztahuje k prvnφmu z uveden²ch SQL p°φkaz∙ a ostatnφ SQL p°φkazy v bloku SQLStatement jsou nepojmenovanΘ.

Za pojmenovßnφm p°φkazu SELECT v hlaviΦce bloku m∙₧e nßsledovat v hranat²ch zßvorkßch v²Φet zßznam∙, kterΘ se majφ p°eΦφst. V²Φet mß formßt

  [Φφslo_prvnφho_zßznamu+poΦet_zßznam∙]

kde Φφslo_prvnφho_zßznamu je po°adovΘ Φφslo zßznamu v odpov∞di (Φφslovßno od nuly), kter² mß b²t p°eΦten, poΦet_zßznam∙ udßvß, kolik zßznam∙ od v²Üe uvedenΘho (vΦetn∞ n∞ho) mß b²t p°eΦteno. ╚ßst +poΦet_zßznam∙ je nepovinnß, nenφ-li p°φtomna, p°edpoklßdß se, ₧e mß b²t p°eΦten pouze zßznam, jeho₧ po°adovΘ Φφslo je uvedeno (tzn. poΦet_zßznam∙=1). nenφ-li v²Φet uveden, p°eΦtou se vÜechny zßznamy (s omezenφm dan²m blokem MaxRecords)

Blok m∙₧e b²t nepovinn∞ ukonΦen p°φkazem EndSQL; nebo EndSQLStatement;. D∙vodem je p°φpadnΘ nutnΘ rozliÜenφ p°φpad∙ s #if, jako:

SQLStatement: abcd
+ ...
#if podmφnka
+ ...
#endif
EndSQL;

a

SQLStatement: abcd
+ ...
EndSQL;
#if podmφnka
...
#endif

P°φklady:

1) vφce SQL p°φkaz∙ v jednom konektoru

SQLStatement: aplvers
+ SELECT apl_vers, apl_date
+ FROM Sys_par_2

SQLStatement: InfoProv
+ SELECT nazev1
+ FROM Info_provozovatel
+ WHERE id=%id%

DeclareVariable:  WBversion:string[5] := ""
SQLStatement:
+ CALL Version(:>WBversion)

2) pojmenovan² blok, na v²sledek (jeden °ßdek, jedna hodnota) se lze v Üablon∞ odkßzat pomocφ citace <%KolikVoleb.KolikV%>

SQLStatement: KolikVoleb
+ SELECT Count(*) AS KolikV
+ FROM Volby

╪ßdek_SQLStatement_bloku je bu∩ °ßdek SQL p°φkazu, nebo p°φkaz WBC preprocesoru:

P°φklad:

3) blok vyu₧φvajφcφ p°φkaz preprocesoru #ifexists; v p°φkazu citovßna prom∞nnß REMOTE_ADDR vracejφcφ IP adresu u₧ivatele

SQLStatement: 
#ifexists
+ SELECT * FROM Anketa
+ WHERE (ipadr="%REMOTE_ADDR%");
#then
+ UPDATE Anketa
+ SET volba=Str2Int("%hodnota%")
+ WHERE (ipadr="%REMOTE_ADDR%");
#else
+ INSERT INTO Anketa(ipadr, volba)
+ VALUES ("%REMOTE_ADDR%", %hodnota%);
#endif

V SQL p°φkazech provßd∞n²ch v bloku SQLStatement lze pou₧φvat odkazy na prom∞nnΘ (tzv. embedded variables), a to jak na prom∞nnΘ deklarovanΘ v konektoru pomocφ DeclareVariable, tak vstupnφ formulß°ovΘ prom∞nnΘ. SQL p°φkaz hodnotu prom∞nnΘ bu∩ p°eΦte (p°enos sm∞rem k serveru) nebo pozm∞nφ (p°enos od serveru ke klientovi). Druhß varianta je mnohem u₧iteΦn∞jÜφ.

P°ed ka₧dou takovou prom∞nnou je nutno uvΘst v SQL p°φkazu dvojteΦku. Navφc je mo₧no p°idat oznaΦenφ, zda jde o p°enos hodnoty od klienta na server, ze serveru klientovi nebo ob∞ma sm∞ry. Toto oznaΦenφ zefektivnφ p°enosy dat mezi klientem a serverem a zrychlφ prßci. Prom∞nnß (s nßzvem id) se tedy zapφÜe takto:

P°φklad:

1) SQL p°φkaz SELECT INTO zapφÜe hodnotu do prom∞nnΘ:

DeclareVariable: dat_smaz:String[12] := ""
SQLStatement: datum
+ SELECT CAST((CURRENT_DATE - del_obj) AS CHAR(12)) INTO :>dat_smaz
+ FROM Sys_par

2) Slo₧it∞jÜφ SQL procedura vytvo°φ podle formulß°ov²ch prom∞nn²ch podmφnku WHERE, kterß se uplatnφ v nßsledujφcφm SELECTu:

DeclareVariable: podmstr:String[300]=""
SQLStatement: 
+ CALL Podminka_polozky(%datx%,%?datod%,%?datdo%,%pocet%,%ds%,%typ%,%obch%,:>podmstr)

SQLStatement: PoPolozkach
+ SELECT OPol.id_cnk, SUM(OPol.cena_summn) AS cena, C.nazev_zbozi, COUNT(C.id_cenik) AS pocet_obj, CAST(SUM(OPol.mnozstvi) AS INT) AS mnoz, MAX(OH.datum) AS posledni
+ FROM Obj_polozky AS OPol, Cenik AS C, Obj_header AS OH, Obchodni_partneri AS OP, S_zbozi_sk AS SK 
+ WHERE %podmstr% 
+ GROUP BY C.id_cenik
#if pocet>1  
+ HAVING SUM(OPol.mnozstvi)>=%pocet%
#endif;
+ ORDER BY cena DESC 

Ulo₧enß procedura Podminka_polozky mß nßsledujφcφ hlaviΦku - do v²stupnφho parametru zapφÜe vytvo°enou podmφnku:

PROCEDURE `PODMINKA_POLOZKY`(IN datx INT, IN datod DATE, IN datdo DATE, IN pocet INT, IN ds INT, IN typ INT, IN obch INT, OUT podmstr CHAR(300));