Приложение 2. Пример использования хранимых процедур
#includeEXEC 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); }