Выполнение процедуры
Назначение
Выполнение хранимой процедуры.
Синтаксис
Оператор выполнения хранимой процедуры имеет два альтернативных стиля вызова: в стиле СУБД ЛИНТЕР и в стиле СУБД 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.