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.