602SQL-Úplná dokumentace Index  

Volání externích rutin a předávání parametrů (SQL)

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.