602SQL-┌plnß dokumentace Index   Tisk  

Prom∞nnΘ z externφch jazyk∙ v p°φkazech SQL

Pokud je klientskß aplikace vytvo°ena v n∞kterΘm externφm programovacφm jazyce (C/C++, Pascal), pak SQL p°φkaz obsahujφcφ klientskΘ prom∞nnΘ musφ b²t na server poslßn pomocφ API funkce cd_SQL_host_execute nebo cd_SQL_host_prepare, a pou₧itΘ prom∞nnΘ musφ b²t explicitn∞ zp°φstupn∞ny pomocφ jejφho parametru hostvars.

Parametrem hostvars je pole, jeho₧ jednotlivΘ slo₧ky typu t_clivar popisujφ jednotlivΘ klientskΘ prom∞nnΘ pou₧itΘ v p°φkazu SQL. PoΦet slo₧ek pole je uveden v parametru hostvars_count. t_clivar je struktura s tφmto obsahem:

struct t_clivar  // popis promenne klienta pristupne pro SQL server
{ tname     name;   // jmeno promenne (velka pismena)
  t_parmode mode;   // zpusob predavani hodnoty promenne
  int       wbtype; // typ promenne
  uns32     specif; // doplnujici udaje o typu
  void *    buf;    // ukazatel na buffer s hodnotou promenne
  int       buflen; // delka bufferu buf
  int       actlen; // skutecna delka hodnoty - plati pouze pro typy promenne velikosti
};

Typy a hodnoty polo₧ek pou₧it²ch v tΘto struktu°e v definovßny v definiΦnφch souborech pro p°φsluÜnΘ programovacφ jazyky. Pro vstupnφ hodnoty prom∞nnΘ velikosti (BLOB, CLOB) je t°eba vyplnit nejen dΘlku bufferu pro hodnotu buflen, ale i skuteΦnou dΘlku hodnoty actlen. Pro v²stupnφ hodnoty prom∞nnΘ velikosti (BLOB, CLOB) staΦφ vyplnit dΘlku bufferu pro hodnotu buflen, zatφmco skuteΦnß dΘlka hodnoty actlen se ve struktu°e objevφ po provedenφ p°φkazu.

Slo₧ka specif obsahuje dopl≥ujφcφ ·daje o typu prom∞nnΘ. Je to obsah struktury t_specif zapsan² jako32-bitovΘ celΘ Φφslo. Pro znakovΘ a binßrnφ °et∞zce pevnΘ dΘlky je to maximßlnφ dΘlka °et∞zce, pro p°esnß Φφsla je to poΦet desetinn²ch mφst, v ostatnφch p°φpadech nula.

ZnaΦky < a > udßvajφcφ v SQL p°φkazu sm∞r p°enosu hodnoty nenφ nutno uvßd∞t, proto₧e stejnß informace je ji₧ obsa₧ena ve slo₧ce mode. Je-li tyto znaΦky uvedeny, ignorujφ se.

Dynamickß alokace bufferu

Pro v²stupnφ hodnoty prom∞nnΘ velikosti (BLOB, CLOB) nemusφ b²t p°ed provedenΘm p°φkazu z°ejmß dΘlka hodnoty. M∙₧e b²t proto obtφ₧nΘ p°edem alokovat buffer, kter² pojme celou vrßcenou hodnotu.

V takovΘm p°φpad∞ lze nastavit ukazatel na buffer buf na NULL, ·daj buflen se pak ignoruje. P°i provedenφ p°φkazu se automaticky alokuje buffer pot°ebnΘ velikosti a bude vrßcen v buf. Programßtor musφ potΘ buffer uvolnit pomocφ funkce corefree.

P°φklad:

Volßnφ funkce Maxim_plat s p°edßnφm vstupnφho parametru a nßvratem hodnoty:

t_clivar vardescr[2];
int os_cislo, max_plat;
strcpy(vardescr[0].name, "OS_CISLO");
vardescr[0].mode=MODE_IN;
vardescr[0].wbtype=ATT_INT32;
vardescr[0].specif=0;
vardescr[0].buf=&os_cislo;
vardescr[0].buflen=sizeof(os_cislo);
strcpy(vardescr[1].name, "MAX_PLAT");
vardescr[1].mode=MODE_OUT;
vardescr[1].wbtype=ATT_INT32;
vardescr[1].specif=0;
vardescr[1].buf=&max_plat;
vardescr[1].buflen=sizeof(max_plat);
os_cislo = 1294;
cd_SQL_host_execute(cdp, "SET :>MAX_PLAT = MAXIM_PLAT(:<OS_CISLO)", NULL, vardescr, 2);
// vysledek je v promenne max_plat.