Uživatelské nástroje

Nástroje pro tento web


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

BIN2HEX

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

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: 2017/06/27 12:00 autor: Petr Skovajsa

Nástroje pro stránku