phpRS            

Dnešní datum: 07. 09. 2010   | Hlavní stránka | Seznam rubrik | Kniha návštěv |  
  Hlavní menu
Hlavní stránka
Seznam rubrik
Fotogalerie
Kniha návštěv
Stáhněte si
Odkazy
Ankety
TOP 15

  Reklama


  Rubriky

  Poslouchám na síti


Spusť přehrávač


Spusť přehrávač


  Informace o webu
Všehochuť aneb od každého trochu

Content © 1991-2010 Slávek Rydval

View Slávek Rydval's profile on LinkedIn

Vytvořeno pomocí phpRS a Texy!

RSS kanál

Odborné články

* InterBase a UDF

Vydáno dne 04. 08. 2005 (2384 přečtení)

Pokud začnete s databázovým strojem InterBase opravdu pracovat, nabudete dojmu, že vám něco chybí. Tento pocit je umocněn, jestliže máte zkušenosti s databází většího rozměru (Oracle, MS SQL Server). Jsou to funkce, které byste rádi použili například ve výběru množiny (příkaz SELECT).

Představte si, že máte v tabulce sloupeček s reálnými čísly a vy chcete jejich druhou odmocninu. Nebo potřebujete na základě hodnoty nějakého čísla vrátit řetězec (v Oracle funkce DECODE, v MS SQL Serveru CASE) a další. V InterBase k tomu slouží User Defined Functions (UDF), což jsou knihovny DLL (na platformě Windows samozřejmě), ve kterých jsou všechny potřebné funkce uloženy. Takovouto DLL si můžete napsat sami, lze použít C++ ale i třeba Delphi.

Ačkoliv se může zdát, že na první pohled InterBase nic nenabízí, není to tak docela pravda. Ve standardní dodávce je totiž knihovna pojmenovaná ib_udf.dll, která dává programátorům k dispozici hned několik funkcí (popis je uveden v tabulce). Ukažme si na několika příkladech, jak je použít.

Začneme odmocninou. Není sice tak zcela běžné, že v databázích odmocňujeme, ale co když je potřeba počítat například pomocí Pythagorovi věty?

Nejprve musíte říct databázovému serveru, že vůbec nějaká takováto funkce existuje a kde ji má hledat. K tomu slouží příkaz DECLARE EXTERNAL FUNCTION, jehož syntaxe vypadá následovně:

1) DECLARE EXTERNAL FUNCTION name
2)   [ datatype | CSTRING ( int)
      [, datatype | CSTRING ( int) ]]
3)   RETURNS { datatype [BY VALUE] |
               CSTRING ( int)} [FREE_IT]
4)   ENTRY_POINT 'entryname'
5)   MODULE_NAME 'modulename';

V prvním řádku určíme, jak se bude naše funkce jmenovat, druhý řádek určuje parametry, třetí návratovou hodnotu, čtvrtý název funkce, pod kterým byla v knihovně exportována a konečně poslední říká název knihovny.

Ale zpět k odmocnině. V uvedeném souboru je exportovaná funkce IB_UDF_sqrt, kterou je tedy potřeba načíst:

DECLARE EXTERNAL FUNCTION sqrt
  DOUBLE PRECISION
  RETURNS DOUBLE PRECISION BY VALUE
  ENTRY_POINT "IB_UDF_sqrt"
  MODULE_NAME "ib_udf";

a teď nám již nic nebrání tomu ji použít:

SELECT sqrt (SOMENUMBER) FROM SOMETABLE;

Funkce, kterou ovšem zřejmě postrádáte mnohem více, je vrácení podřetězce z řetězce nebo délku textu. I tyto funkce jsou v naší knihovně obsaženy. Protože vrácení podřetězce vyžaduje více parametrů, ukažme si její deklarování:

DECLARE EXTERNAL FUNCTION substr
        CSTRING(80), SMALLINT, SMALLINT
        RETURNS CSTRING(80) FREE_IT
        ENTRY_POINT "IB_UDF_substr"
        MODULE_NAME "ib_udf";

Příkaz SELECT ovšem není jediný, kde lze uživatelské funkce použít. Podobně můžeme volat UDF v příkazech UPDATE, INSERT, nebo v klauzuli WHERE a další. Trošku odlišným způsobem je lze použít taktéž v příkazu CREATE TABLE (zde funkce upper):

CREATE TABLE LOVEY (
  NAME VARCHAR (20),
  SURNAME VARCHAR (20),
  FULL_NAME_UPPER COMPUTED BY
    (upper (NAME) || " " || upper (SURNAME))
);

V níže uvedené tabulce jsem uvedl názvy standardních funkcí a jejich krátký popis. Pokud budete chtít znát všechny podrobnosti, zejména jak tyto funkce načíst do databáze, podívejte se na skript Ib_udf.sql, který je společně s databází dodáván.

Název funkce Popis
IB_UDF_abs Matematická funkce absolutní hodnota
IB_UDF_acos Matematická funkce arccosinus
IB_UDF_ascii_char Vrátí znak odpovídající ASCI hodnotě
IB_UDF_ascii_val Vrátí ASCI hodnotu odpovídající zadanému znaku
IB_UDF_asin Matematická funkce arcsinus
IB_UDF_atan Matematická funkce arctangent
IB_UDF_atan2 Matematická funkce arctangent vydělená druhým parametrem
IB_UDF_bin_and Binární AND
IB_UDF_bin_or Binární OR
IB_UDF_bin_xor Binární XOR
IB_UDF_ceiling Vrátí nejmenší celé číslo větší nebo rovno argumentu
IB_UDF_cos Matematická funkce cosinus
IB_UDF_cosh Matematická funkce hyperbolický cosinus
IB_UDF_cot Matematická funkce cotangent
IB_UDF_div Celočíselné dělení
IB_UDF_floor Vrátí největší celé číslo menší nebo rovno argumentu
IB_UDF_ln Přirozený logaritmus
IB_UDF_log Logaritmus požadovaného základu
IB_UDF_log10 Logaritmus základu 10
IB_UDF_lower Vrátí řetězec převedený na malá písmena
IB_UDF_ltrim Zbaví řetězec levých mezer
IB_UDF_mod Zbytek po celočíselném dělení
IB_UDF_pi Vrátí konstatu Pi
IB_UDF_rand Vygeneruje pseudonáhodné číslo v rozmezí 0 a 1
IB_UDF_rtrim Zbaví řetězec pravých mezer
IB_UDF_sign Matematrická funkce signum
IB_UDF_sin Matematická finkce sinus
IB_UDF_sinh Matematické funkce hyperbolický sinus
IB_UDF_sqrt Druhá odmocnina
IB_UDF_substr Vrátí požadovaný podřetězec
IB_UDF_strlen Vrátí délku řetězce
IB_UDF_tan Matematická funkce tangent
IB_UDF_tanh Matematická funkce hyperbolický tangent

Tímto náš malý seriál, který se ve všech dílech točil kolem InterBase, končí. Doufám, že přinesl alespoň trochu světla do této problematiky a že již tento databázový server používáte.


Tento článek byl napsán pro časopis Softwarové noviny 6/2001.

Upozornění: tento text neprošel redakční úpravou, takže je tak, jak byl napsán včetně případných chyb. Žádná část tohoto článku nesmí být použita bez předchozího souhlasu autora.

Seznam mých dalších článků je v tomto přehledu.




[Akt. známka: 0 / Počet hlasů: 0] 1 2 3 4 5

Celý článek | Autor: Slávek Rydval | Počet komentářů: 0 | Přidat komentář | Informační e-mailVytisknout článek

  Čtenář
Jméno:
Heslo:


Registrace | Info
Zapomenuté heslo

  Vyhledávání

Hledej
na Nawebce!


Rozšířené vyhledávání

  Kalendář
<<  Září  >>
PoÚtStČtSoNe
  1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30    

  Reklama


rkEdit Oracle Profiler
rkEdit Oracle Profiler