Выполнение процедуры
Назначение
Выполнение хранимой процедуры.
Синтаксис
Оператор выполнения хранимой процедуры имеет два альтернативных стиля вызова: в стиле СУБД ЛИНТЕР и в стиле СУБД Ingres.
Примечание
Если процедура не имеет прототипа (не была объявлена с помощью операторов DECLARE | CREATE | ALTER PROCEDURE), считается, что стиль оператора EXECUTE PROCEDURE такой же, как у СУБД Ingres.
<выполнение процедуры в стиле СУБД ЛИНТЕР >::=
EXEC SQL EXECUTE PROCEDURE
[<результат>=][<имя схемы>.]
<имя процедуры>([<параметр>][,<параметр>][,...]);
<выполнение процедуры в стиле Ingres>::=
EXEC SQL EXECUTE PROCEDURE
[<имя схемы>.]<имя процедуры>(<формальный параметр>=<фактический параметр>,...) [INTO <результат>];
<результат>::= <возвращаемое значение>[.<индикатор>]
<возвращаемое значение>::=
<переменная основного языка числового типа >
| <переменная основного языка символьного типа>
| CURSOR
<имя схемы>::= идентификатор встроенного SQL
<параметр>::=
{:<переменная основного языка>[:<индикаторная переменная>]
| <литерал>
| <пропуск параметра>}
<пропуск параметра>::= ',,'
Описание
-
<Имя процедуры>– идентификатор встроенного языка. Задает имя процедуры. Процедура с таким именем и<имя схемы>(если оно задано) должна быть предварительно либо объявлена с помощью оператораDECLARE PROCEDURE, либо создана (модифицирована) с помощью оператораCREATE (ALTER) PROCEDURE. -
Для выходных параметров тип фактического параметра должен соответствовать типу формального, используемого процедурой.
-
Если процедура может возвращать NULL-значение, то для проверки ее результата или выходного параметра, заданного именованным динамическим параметром, на NULL-значение должна использоваться индикаторная переменная.
-
Если индикаторная переменная не задана, а возвращаемое значение является NULL-значением, фиксируется ошибочная ситуация.
-
Если результат процедуры имеет тип данных
DATE, используется форматdd.mm.yyyy:hh:mi:ss. -
Если результат процедуры типа BLOB, возвращается заголовок длиной 24 байта.
-
Если результат процедуры типа
BYTE, возвращается строка байт. -
Если результат процедуры типа
CURSOR, возвращается курсорная переменная, которую можно использовать в операторахFETCH,{ADD | GET | CLEAR} BLOB,CLOSE. -
Если возвращаемое значение не типа
CURSORи если возвращается NULL-значение, индикаторная переменная имеет нулевое значение, иначе она содержит длину результата (в байтах). Т.е. использование индикаторной переменной отличается от использования в других предложениях встроенного языка. Если возвращаемое значение типаCURSOR, индикаторная переменная содержит количество записей, выбранных для данного курсора, или нулевое значение, если курсор пуст. -
Если в процессе исполнения хранимой процедуры произошла ошибка,
ErrPCI_содержит код завершения СУБД ЛИНТЕР. -
Тип переменной основного языка должен соответствовать типу результата, который возвращается процедурой.
-
В режиме совместимости с СУБД Ingres параметры при вызове процедуры должны быть всегда неименованные.
Пример
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#if defined(VXWORKS)
#include "vxstart.h"
#endif
#ifdef _DOS_
#include <conio.h>
#endif
EXEC LINTER IFDEF SQL;
EXEC SQL INCLUDE SQLCA;
EXEC LINTER ENDIF;
EXEC SQL BEGIN DECLARE SECTION;
char *user = "SYSTEM";
char *pswd = "MANAGER8";
char *node = "LISACHEV";
int m1 = 0, m2 = 0;
int i1 = 0, i2 = 0;
int res = 0;
char ch1[10] = {0};
char ch2[10] = {0};
EXEC SQL END DECLARE SECTION;
#if defined(VXWORKS)
MainStart(pcc_sample, 1024*32, UninitLinterClient)
#else
int main()
#endif
{
char c = 0;
printf("Создание соединения...");
EXEC SQL WHENEVER SQLERROR GOTO not_conn;
EXEC SQL CONNECT AUTOCOMMIT :user IDENTIFIED BY :pswd USING :node;
printf("готово.\n");
printf("Объявление процедуры...");
EXEC SQL WHENEVER SQLERROR GOTO not_declared;
EXEC SQL DECLARE PROCEDURE STRADD(in ch1 char(10); in ch2 char(10)) result int;
printf("готово.\n");
printf("Введите первое число >");
gets(ch1);
printf("\n");
printf("Введите второе число >");
gets(ch2);
printf("\n");
printf("Выполнение процедуры...");
EXEC SQL EXECUTE PROCEDURE :res = STRADD(:ch1, :ch2);
printf("Готово. '%s' + '%s' = %d\n", ch1, ch2, res);
return 0;
not_conn:
printf("Не удалось создать соединение\n");
printf("Код ошибки: %d\n", ErrPCI_);
return 1;
not_declared:
printf("Не удалось объявить процедуру\n");
printf("Код ошибки: %d\n", ErrPCI_);
return 1;
not_executed:
printf("Не удалось выполнить процедуру\n");
printf("Код ошибки: %d\n", ErrPCI_);
return 1;
}
Пример использования хранимых процедур приведен также в приложении 2.