Приложение 2. Пример использования хранимых процедур

#include < stdio.h >
EXEC SQL INCLUDE SQLCA;
/* Создается процедура RETCUR(): прекомпилятор должен быть вызван таким образом:*/
/* PCC -S -U SYSTEM/PASSWORD ... */
EXEC SQL CREATE PROCEDURE RETCUR(IN AgeMin INT; IN AgeMax INT;INOUT name CHAR(32); OUT cnt INT) RESULT CURSOR_PCI(
name char(20),
city char(15)
)
declare
var c typeof(result);
exception notab for 2202;
code
 cnt := 16383;
 name := "16383";
 open c for direct "select name,city from person where Age >="+itoa(AgeMin)+"and Age< ="+itoa(AgeMax)+";";
 return c;
exceptions
 when notab then
 print("no such table!\n");
END;
END-EXEC;
EXEC SQL BEGIN DECLARE SECTION;
CURSOR_PCI CR;
char *User;
int MinAge, MaxAge, CNT;
char NAME[32], CITY[32];
long KOLKOR, isNULL;
int RETINT;
short RETSMI;
float RETREL;
double RETNUM;
char RETCHR[32];
char RETBYT[32];
char RETDAT[32];
EXEC SQL END DECLARE SECTION;
/* Описание процедуры SYSTEM.RETCUR. Результат процедуры – курсор. */
/* Расшифровки его полей нет, в отличие от случая создания процедуры. */
EXEC SQL DECLARE PROCEDURE
 SYSTEM.RETCUR(IN INT;IN INT;INOUT CHAR(32);OUT INT)RESULT CURSOR_PCI;
/* Описания процедур, возвращающих значения различных типов */
/* Процедуры должы быть уже созданы к моменту запуска программы */
EXEC SQL DECLARE PROCEDURE SYSTEM.RETCHR()RESULT char(32);
EXEC SQL DECLARE PROCEDURE SYSTEM.RETINT()RESULT int;
EXEC SQL DECLARE PROCEDURE SYSTEM.RETSMI()RESULT SMALLINT;
EXEC SQL DECLARE PROCEDURE SYSTEM.RETREL()RESULT real;
EXEC SQL DECLARE PROCEDURE SYSTEM.RETDAT()RESULT date;
EXEC SQL DECLARE PROCEDURE SYSTEM.RETNUM()RESULT real;
EXEC SQL DECLARE PROCEDURE SYSTEM.RETBYT()RESULT byte(32);
EXEC SQL DECLARE PROCEDURE SYSTEM.RETNUL()RESULT byte(32);
void main()
{
MinAge=20; MaxAge=30; CNT=0;
strcpy (NAME, "33");
EXEC SQL WHENEVER SQLERROR GOTO err_open;
User = "SYSTEM/MANAGER8";
EXEC SQL CONNECT :User;
/* Создаем динамический курсор: он получит значение в результате работы процедуры SYSTEM.RETCUR() */
EXEC SQL ALLOCATE :CR;
/* Исполнение процедур */
EXEC SQL EXECUTE PROCEDURE :RETCHR = system.retchr();
printf("\nThis is the string: %s",RETCHR);
EXEC SQL EXECUTE PROCEDURE :RETINT = system.retint();
printf("\nThis is the Int : %ld",RETINT);
EXEC SQL EXECUTE PROCEDURE :RETSMI = system.retsmi();
printf("\nThis is the Small : %d", RETSMI);
EXEC SQL EXECUTE PROCEDURE :RETREL = system.retrel();
printf("\nThis is the Real : %f", RETREL);
EXEC SQL EXECUTE PROCEDURE :RETDAT = system.retdat();
printf("\nThis is the Date : %s", RETDAT);
EXEC SQL EXECUTE PROCEDURE :RETNUM = system.retnum();
printf("\nThis is the Num : %f", RETNUM);
EXEC SQL EXECUTE PROCEDURE :RETBYT = system.retbyt();
printf("\nThis is the Byte(): %s", RETBYT);
EXEC SQL EXECUTE PROCEDURE :RETBYT:isNULL = system.retnul();
if (isNULL == 0)
 printf("\nThis is the NULL");
EXEC SQL EXECUTE PROCEDURE SYSTEM.RETINT();
printf("\nThis procedure nothing return");
EXEC SQL EXECUTE PROCEDURE
 :CR = system.retcur(:MinAge, :MaxAge, :NAME, :CNT);
printf("\nThis is the NAME : %s", NAME);
printf("\nThis is the CNT : %ld", CNT);
printf("\nKOLKOR : %ld", KOLKOR);
/* FETCH по курсору, возвращенному процедурой SYSTEM.RETCUR() */
for(;ErrPCI_==0;)
{
EXEC SQL FETCH :CR INTO :NAME, :CITY;
if (!ErrPCI_)
 printf("\nNAME is : %s ; CITY is : %s", NAME, CITY);
}
/* Закрытие динамического курсора */
EXEC SQL CLOSE :CR;
/* Освобождение памяти, занимаемой динамическим курсором */
EXEC SQL DEALLOCATE :CR;
EXEC SQL COMMIT RELEASE;
err_open:
printf("\n\nExit code: %ld", ErrPCI_);
exit(1);
}