602SQL-Úplná dokumentace Index  

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, bez využití CDK komponent nebo ADO.NET provideru), pak SQL příkaz obsahující klientské proměnné musí být na server poslán pomocí API funkce SQL_host_execute nebo 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 proměnné klienta přístupné pro SQL server
{ tname     name;   // jméno proměnné (velká písmena)
  t_parmode mode;   // způsob předávání hodnoty proměnné
  int       wbtype; // typ proměnné
  t_specif  specif; // doplňující údaje o typu
  void *    buf;    // ukazatel na buffer s hodnotou proměnné
  int       buflen; // délka bufferu buf
  int       actlen; // skutečná délka hodnoty - plati pouze pro typy proměnné velikosti
};
type t_clivar = record
  name : tname;      { jmeno promenne (velka pismena) }
  mode : t_parmode;  { zpusob predavani hodnoty promenne }
  wbtype : Integer;  { typ promenne }
  specif : t_specif; { specificke udaje k typu (delka retezce, pocet desetinnych mist,...)}
  buf : Pointer;     { ukazatel na buffer s hodnotou promenne }
  buflen : Integer;  { delka bufferu buf }
  actlen : Integer;  { skutecna delka hodnoty - plati pouze pro typy promenne velikosti }
end;

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é řetězce pevné délky je to maximální délka řetězce, charset a příznak UNICODE, pro binární řetězce pevné délky je jejich to délka, pro přesná čísla (NUMERIC) 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. Jsou-li tyto přesto značky v SQL příkazu 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.