|
Zrušení rutiny (DROP PROCEDURE | FUNCTION) | Rutiny uložené na serveru | Určení adresářů s DLL knihovnami pro SQL server |
Rutiny uložené na serveru mohou volat procedury a funkce vytvořené v externím programovacím prostředí. Způsob deklarace těchto rutin je popsán v popisu procedury. Pokud SQL server na Linuxu běží pod účtem uživatele root, není dovoleno volat externí procedury - při pokusu je vyvolána chyba WONT_RUN_AS_ROOT (228).
Příklad:
DECLARE FUNCTION TestFnc(INOUT cis CHAR(25)) RETURNS INT;
EXTERNAL NAME 'TestFnc@TestDLL';
O externích rutinách se předpokládá, že používají volací konvenci _STDCALL. Musí být umístěny v 32-bitové knihovně DLL (resp. so na Linuxu). Volání 16-bitových rutin nebo rutin s jinou volací konvencí není možné.
Při vytváření knihovny funkcí je nutno nastavit parametry překladače tak, aby, funkce používaly standardní stack frame. Parametry se jim nesmějí předávat v registrech. Zejména knihovny vytvářené v Delphi občas dostávají parametry v registrech a pak je nelze volat ze SQL serveru.
Formální parametry označené OUT nebo INOUT se jim předávají referencí (tedy předává se adresa hodnoty parametru), formální parametry označené IN nebo neoznačené se předávají hodnotou. Označení a typ formálního parametru v deklaraci rutiny musí souhlasit s typem a způsobem předávání parametru v modulu, v němž je rutina implementována, podle pravidel daných touto tabulkou:
typ v jazyce C/C++ | typ v jazyce PASCAL | typ v popisu rutiny v SQL |
int | Integer | IN INT |
int * | VAR Integer | INOUT INT |
short | SmallInt | IN SMALLINT |
short * | VAR SmallInt | INOUT SMALLINT |
double | Double | IN REAL |
double * | VAR Double | INOUT REAL |
char * | PChar | INOUT CHAR(N) |
char | Boolean | IN BOOLEAN |
unsigned char * | VAR Boolean | INOUT BOOLEAN |
struct { char[N]; } | pole bajtů předávané hodnotou | IN BIT(N), N > 1 |
struct { char[N+1]; } | pole znaků předávané hodnotou | IN CHAR(N) |
char * | PChar | INOUT BIT(N) , N > 1 |
char * | PChar | INOUT CLOB |
Pro mód OUT platí stejná pravidla jako pro mód INOUT. Parametr se předává referencí, ale jeho hodnota se nepřenáší dovnitř volané funkce, pouze z ní ven.
S typem BLOB se zachází stejně jako s typem CLOB. S typem REAL lze zacházet stejně jako s DOUBLE PRECISION. S typy TIME, DATE a TIMESTAMP lze zacházet stejně jako s typem INT, ale na straně externí rutiny je nutné správné dekódování hodnoty.
Externí rutině lze předat jako parametr hodnotu proměnné velikosti (BLOB, CLOB). Hodnotu lze měnit, nesmí však zvětšit svoji velikost.
Pozor!
Nedodržení těchto konvencí (záměna IN a OUT/INOUT v deklaraci externí rutiny) může vést k přepsání paměti a pádu SQL serveru.
Zrušení rutiny (DROP PROCEDURE | FUNCTION) | Rutiny uložené na serveru | Určení adresářů s DLL knihovnami pro SQL server |