Выполнение процедуры

Назначение

Выполнение хранимой процедуры.

Синтаксис

 

Оператор выполнения хранимой процедуры имеет два альтернативных стиля вызова: в стиле СУБД ЛИНТЕР и в стиле СУБД Ingres.

Примечание

Если процедура не имеет прототипа (не была объявлена с помощью операторов DECLARE | CREATE | ALTER PROCEDURE), считается, что стиль оператора EXECUTE PROCEDURE такой же, как у СУБД Ingres.

< выполнение процедуры в стиле СУБД ЛИНТЕР  >::=
EXEC SQL EXECUTE PROCEDURE
[< результат >=][< имя схемы >.]
< имя процедуры >([< параметр >][,< параметр >][,...]);

< выполнение процедуры в стиле Ingres >::=
EXEC SQL EXECUTE PROCEDURE
 [< имя схемы >.]< имя процедуры >(< формальный параметр >=< фактический параметр >,...) [INTO < результат >];

< результат >::= < возвращаемое значение >[.< индикатор >]
< возвращаемое значение >::=
 < переменная основного языка числового типа  >
 | < переменная основного языка символьного типа >
 | CURSOR
< имя схемы >::= идентификатор встроенного SQL
 < параметр >::=
  {:< переменная основного языка >[:< индикаторная переменная >]
  | < литерал >
  | < пропуск параметра >}
< пропуск параметра >::= ',,'

Описание

  1. < Имя процедуры > – идентификатор встроенного языка. Задает имя процедуры. Процедура с таким именем и < имя схемы > (если оно задано) должна быть предварительно либо объявлена с помощью оператора DECLARE PROCEDURE, либо создана (модифицирована) с помощью оператора CREATE (ALTER) PROCEDURE.

  2. Для выходных параметров тип фактического параметра должен соответствовать типу формального, используемого процедурой.

  3. Если процедура может возвращать NULL-значение, то для проверки ее результата или выходного параметра, заданного именованным динамическим параметром, на NULL-значение должна использоваться индикаторная переменная.

  4. Если индикаторная переменная не задана, а возвращаемое значение является NULL-значением, фиксируется ошибочная ситуация.

  5. Если результат процедуры имеет тип данных DATE, используется формат dd.mm.yyyy:hh:mi:ss.

  6. Если результат процедуры типа BLOB, возвращается заголовок длиной 24 байта.

  7. Если результат процедуры типа BYTE, возвращается строка байт.

  8. Если результат процедуры типа CURSOR, возвращается курсорная переменная, которую можно использовать в операторах FETCH, {ADD | GET | CLEAR} BLOB, CLOSE.

  9. Если возвращаемое значение не типа CURSOR и если возвращается NULL-значение, индикаторная переменная имеет нулевое значение, иначе она содержит длину результата (в байтах). Т.е. использование индикаторной переменной отличается от использования в других предложениях встроенного языка. Если возвращаемое значение типа CURSOR, индикаторная переменная содержит количество записей, выбранных для данного курсора, или нулевое значение, если курсор пуст.

  10. Если в процессе исполнения хранимой процедуры произошла ошибка, ErrPCI_ содержит код завершения СУБД ЛИНТЕР.

  11. Тип переменной основного языка должен соответствовать типу результата, который возвращается процедурой.

  12. В режиме совместимости с СУБД 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.