602SQL-┌plnß dokumentace Index   Tisk  

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.

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 Delhpi 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 OUT INT
short SmallInt IN SMALLINT
short * VAR SmallInt OUT SMALLINT
double Double IN REAL
Double * VAR Double OUT REAL
char * PChar OUT CHAR(N)
char Boolean IN BIT(1)
   
char * VAR Boolean OUT BIT(1)
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 OUT BIT(N) , N > 1
char * PChar INOUT CLOB

Pro m≤d INOUT platφ stejnß pravidla jako pro m≤d OUT.

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.