free_programs
Procedury a funkce SQL
Níže uvedené zdrojové kódy funkcí a procedur slouží k výukovým účelům, jsou volně šiřitelné a pokud je použijete, vždy uvádějte jako zdroj tyto stránky. V případě vhodnější implementace dané funkce v 602SQL8 uvítám jakoukoliv zpětnou vazbu.
DEC2HEX
- sp_dec2hex.psm
FUNCTION `sp_dec2hex`( IN xvalue BIGINT ) RETURNS CHAR(16); /* Funkce pro převod desítkové na šestnáctkovou, přidán xtemp protože jinak SUBSTRING nejde s bigintem dohromady maximum dec: 9223372036854775807 hex: 7FFFFFFFFFFFFFFF */ BEGIN DECLARE xseq CHAR(16); DECLARE xresult CHAR(16); DECLARE xdigit CHAR(1); DECLARE xtemp smallint; SET xseq = "0123456789ABCDEF"; SET xtemp = (xvalue mod 16)+1; SET xresult = SUBSTRING(xseq FROM xtemp FOR 1); WHILE xvalue > 0 DO SET xtemp = (((xvalue DIV 16) MOD 16)+1); SET xdigit = SUBSTRING(xseq from xtemp FOR 1); SET xvalue = xvalue DIV 16; IF xvalue <> 0 THEN SET xresult = xdigit + xresult; END IF; END WHILE; RETURN xresult; END
POW
- sp_pow.psm
FUNCTION `sp_pow`( IN cislo BIGINT, IN exponent BIGINT, OUT errmsg DOM_ERRMSG ) RETURNS BIGINT; /* Funkce na mocninu - zadava se cislo^exponent resp. X^ntou - tahle fce chybi v 602SQL nebo jsem ji nenasel Potřeboval jsem to vytvořit např. kvůli převádění čísla ze soustavy dvojkové na desítkovou Delal jsem to podle wiki, kde je napsano, co ma davat treba nula na nultou nebo jedna na nultou nebo nula na prvni apod. */ BEGIN DECLARE vysledek, pocitadlo BIGINT; SET pocitadlo = 1; SET vysledek = cislo; WHILE pocitadlo < exponent DO SET vysledek = vysledek*cislo; SET pocitadlo = pocitadlo+1; END WHILE; RETURN vysledek; // definice vyjimek (exceptions) IF exponent = 0 AND cislo > -1 THEN RETURN 1; END IF; IF exponent < 0 THEN SET errmsg = "Exponent nemuze byt mensi nez 0"; RETURN 0; END IF; END
DEC2BIN
- sp_dec2bin.psm
FUNCTION `sp_dec2bin`( IN cislo BIGINT) RETURNS CHAR(32); // decimal to binary - dekadické na binární // binary is represented as 32 characters (32 as IP binary mask) - reprezentace IP adresy 32bitovou maskou // 8 -> 00000000000000000000000000001000 BEGIN DECLARE pom1, pom2, pozice BIGINT; DECLARE vysledek CHAR(32); DECLARE charcount TINYINT; SET vysledek = ''; SET pozice = 32; REPEAT SET pom1 = cislo DIV 2; // celočíselné dělení SET pom2 = cislo MOD 2; // zbytek po dělení SET cislo = pom1; SET vysledek = STRCAT(BIGINT2STR(pom2),vysledek); IF cislo = 1 THEN SET vysledek = STRCAT('1',vysledek); END IF; UNTIL cislo < 2 END REPEAT; SET charcount = STRLENGTH (vysledek); WHILE charcount <32 DO SET vysledek = STRCAT('0',vysledek); SET charcount = charcount+1; END WHILE; RETURN vysledek; END
BIN2DEC
- sp_bin2dec.psm
FUNCTION `sp_bin2dec`( IN vstup char(32) ) RETURNS BIGINT; // convert binary format to decimal // example: 111 -> 7, 1000 -> 8 // maximum is 11111111111111111111111111111111 -> 4294967295 BEGIN DECLARE charcount, nasobitel TINYINT; DECLARE vysledek BIGINT; SET vysledek = 0; SET charcount = STRLENGTH (vstup); SET nasobitel = 0; WHILE charcount > 0 DO SET vysledek = vysledek + sp_pow(2,nasobitel) * str2bigint(SUBSTRING(vstup FROM charcount FOR 1)); SET charcount = charcount - 1; SET nasobitel = nasobitel + 1; END WHILE; RETURN vysledek; END
free_programs.txt · Poslední úprava: 2018/10/21 18:21 autor: skovajsa