602SQL-Úplná dokumentace Index  

Příkaz CALL - volání procedury (SQL)

volání_procedury ::= CALL [DETACHED] [schema.]jméno ([skutečný_parametr {, skutečný_parametr}… ]);
skutečný_parametr ::= klíčový_parametr | poziční_parametr
klíčový_parametr ::= jméno_formálního_parametru => výraz
poziční_parametr ::= výraz

Příkaz CALL zavolá proceduru vytvořenou příkazem CREATE PROCEDURE (globální - uloženou jako objekt aplikace) nebo lokální (deklarovanou pomocí DECLARE PROCEDURE) nebo standardní deklarovanou v jazyce (např. SQL_execute, Log_write, Free_deleted, Set_sql_option).

Je možné volat i procedury uložené v jiné aplikaci - jméno procedury prefixujte jménem aplikace (v SQL terminologii schématu) a tečkou. Upozornění: procedura je kompilovaná v kontextu aplikace, kde je uložena, ne v kontextu aplikace, odkud je volána. Zavolá-li procedura tabulku neprefixovanou jménem aplikace, použije se tabulka v té aplikaci, kde je procedura uložena.

Je-li použito slovo DETACHED, procedura se spustí v samostatném vlákně - podrobnosti. Jako DETACHED nelze spustit lokální nebo standardní procedury.

Poziční skutečné parametry se přiřazují formálním parametrům uvedeným v popisu procedury na základě své pozice (po řadě zleva doprava), zatímco klíčové parametry jsou rozlišeny na základě jména formálního parametru. Poziční parametry musí být uvedeny před klíčovými.

Hodnota vstupního parametrem je udána hodnotou výrazu. Typ výrazu musí být takový, aby se jeho hodnota dala přiřadit do formálního parametru. Výstupním nebo vstupně-výstupním skutečným parametrem musí být proměnná nebo sloupec stejného typu, jakého je formální parametr.

Rozšíření jazyka SQL proti normě

Implementací definované vlastnosti SQL ve 602SQL

Příklady použití:

Mějme proceduru PARAM s jedním vstupním a jedním výstupním parametrem definovanou takto:

PROCEDURE Param( IN dt DATE, OUT res INT );
BEGIN
  SELECT COUNT(*) INTO res
  FROM Tab1
  WHERE dat = dt;
END

Proceduru lze volat z klientského prostředí, kde jsou deklarovány proměnné datum typu DATE a kolik typu INT takto (poziční parametry):

CALL Param(:<datum, :>kolik);

nebo takto (klíčové parametry):

CALL Param(res=>:>kolik, dt=>:<datum);