В SQL-операторах могут использоваться переменные из прикладной программы.
Операторы:
- определяет запрос;
OPEN и CLOSE - начинает и завершает процесс обработки.
Приведем пример приложения, использующего
main()
// Включение структуры для обработки ошибок
{ EXEC SQL INCLUDE SQLCA;
// Объявление хост-переменных
// (связи и INTO-переменные)
EXEC SQL BEGIN DECLARE SECTION;
int NumIndID;
int NumID; // Эти переменные
// указываются после символа :
char Sal[10];
EXEC SQL END DECLARE SECTION;
// Обработка ошибок
EXEC SQL WHENEVER SQLERROR GOTO err_1;
EXEC SQL WHENEVER NOT FOUND GOTO err_2;
// Запрос параметров
printf ("Type individual number: ");
scanf("%d",NumIndID);
// Выполнение SQL запроса
EXEC SQL SELECT NumID, Sal FROM tbl1
WHERE NumIndID =: NumIndID
INTO :NumID, :Sal;
// Отображение результата
std::cout<< "Number: "<<NumID;
exit(0);
err_1:
std::cout<<'' SQLERROR'';
exit(1);
err_2:
std::cout<<'' NOT FOUND";
exit(1); }
Типы данных преобразуются автоматически для каждой СУБД.
СУБД возвращает информацию об ошибках через специальные SQLCA ), переменную SQLSTATE или SQLCODE.
Теперь рассмотрим более подробно синтаксис языка
Фактически, чтобы приложение могло обращаться к базе данных, существуют четыре основных варианта:
Встраиваемый SQL-оператор указывается после фразы .
На следующей схеме изображен процесс выполнения программы, содержащей операторы
(рис 9.1) Процесс выполнения программы, содержащей операторы встроенного SQL.На первом этапе исходный код обрабатывается прекомпилятором, иногда также называемым препроцессором. Интегрированные среды программирования включают в свой состав
прекомпиляторы для
Таким образом, выполнение SQL-оператора было последовательно заменено на вызов внешней процедуры, которая затем была связана с библиотекой СУБД. Поэтому на этапе выполнения библиотечные вызовы будут передаваться непосредственно СУБД.
При выполнении программы со встроенным SQL могут быть использованы привилегии как выполняющего, так и владеющего пользователя (того, кто создал выполнимый файл).
В современных коммерческих СУБД, как правило, относительно хранимых в базе данных модулей, существует возможность назначения привилегии EXECUTE таким образом, чтобы
при выполнении модуля использовались привилегии его владельца.
Во
При указании переменной основного языка программирования в коде SQL-оператора перед этой переменной следует вставлять символ двоеточия.
Перед тем как использовать такую переменную, она должна быть объявлена в разделе объявления SQL-переменных. Объявление SQL-переменных указывается
между парой операторов и .
В и
Например:
// Код для объявления переменных на языке С++:
EXEC SQL BEGIN DECLARE SECTION;
int var1;
int var2;
char var3[10];
EXEC SQL END DECLARE SECTION;
// Код для объявления переменных на языке Pascal:
EXEC SQL BEGIN DECLARE SECTION;
var;
var1: integer;
var2: integer;
var3: array (1..10) of char;
EXEC SQL END DECLARE SECTION;
SELECT сразу может указать имена переменных, в которые будут занесены результаты запроса.
Такие переменные называются
Для использования
Результирующий набор будет гарантированно возвращать только одну строку в следующих случаях:
PRIMARY KEY или UNIQUE ;GROUP BY отсутствует;SELECT однозначно определяют возвращаемую строку.Например:
EXEC SQL SELECT f1,f2,f3 FROM tbl1
INTO :var1, var2, var3 WHERE f1=1;
Имена INTO-переменных могут совпадать с именами полей, так как это разные идентификаторы, отличающиеся наличием у INTO-переменных символа "двоеточие".
WHERE для вычисления условия, в операторах INSERT и DELETE для определения устанавливаемых значений.
Например:
EXEC SQL INSERT INTO tbl2 (f1,f2,f3)
VALUES (:f1,:f2,:f3);
, в котором фраза FOR определяет запрос, ассоциируемый
с данным
Например, оператор
EXEC SQL DECLARE c1 CURSOR FOR
SELECT f1,f2,f3 FROM tbl1 WHERE f2>100;
создает c1 на базе таблицы tbl1. При OPEN CURSOR.
Например, оператор
EXEC SQL OPEN CURSOR с1;
создаст SELECT.
Приложение получает доступ к данным
Для извлечения данных из
Например, оператор
EXEC SQL FETCH c1 INTO :f1,:f2,:f3;
извлекает значения текущей строки
Для освобождения памяти, выделенной под CLOSE CURSOR.
Например:
EXEC SQL CLOSE CURSOR с1;
Для работы с NULL-значениями предусмотрены индикаторные переменные, которые могут использоваться для:
Если в результате выполнения оператора или оператора SELECT (возвращающего одну строку) извлекаемые данные
принимают значение NULL, то, во-первых, считается, что SQL-оператор выполнен с ошибкой, а во-вторых, в NULL (зависит от типа переменной). Для предотвращения таких ситуаций применяются индикаторные переменные,
указываемые после :). Если индикаторная переменная принимает отрицательное
значение, значит, столбец содержит значение NULL. По умолчанию до выполнения оператора индикаторной переменной присваивается значение 0.
Например:
Если в операторе INSERT или UPDATE требуется указать, что используемая NULL, то после этой переменной через двоеточие следует записать индикаторную переменную. В этом случае при отрицательном
значении индикаторной переменной в базу данных будет занесено значение NULL.
При фиксировании усекаемых строк в индикаторную переменную записывается первоначальная длина строки, а сама строка записывается в переменную основного языка с усечением.
DELETE и UPDATE может использоваться фраза WHERE CURRENT OF, определяющая,
что действие относится к текущей строке
UNION и ORDER BY ;Например:
EXEC SQL DECLARE c1 CURSOR FOR SELECT f1,f2 FROM tbl1;
EXEC SQL OPEN CURSOR c1;
EXEC SQL FETCH c1 INTO :f1,:f2;
EXEC SQL UPDATE tbl1 SET f2=f2*1.3
WHERE CURRENT OF c1;
DELETE удобно использовать для удаления из таблицы группы строк, предварительно выбранных в
SQLSTATE имеет тип char(5) и содержит информацию о классе (два старших символа) и подклассе (3 младших символа), описывающих состояние выполненного SQL-оператора;SQLCODE имеет Как и другие переменные, используемые во SQLSTATE и SQLCODE предварительно должны быть объявлены. Однако переменная SQLCODE может быть создана по умолчанию, если нет объявления другой переменной, получающей информацию о завершении выполнения SQL-оператора.
После выполнения SQL-оператора данные о статусе и коде выполнения автоматически записываются СУБД в эти переменные.
Статус выполнения SQL-оператора может быть определен как:
SQLSTATE коду '00000' (класс '00' ). SQLCODE в этом случае тоже равна 0;'02' в SQLSTATE определяет предупреждение 'NOT FOUND' ; класс состояния '01' указывает предупреждение, более точно специфицируемое подклассом;'03' и последующие в SQLSTATE описывают различные ошибочные ситуации (подклассы специфицируют как стандартные ситуации, так и определяемые приложением).Предупреждение 'NOT FOUND' указывает, что SQL-оператор не содержал ошибки, но не вернул ожидаемого результата. Например, сформированный результирующий набор не содержит ни одной строки, или оператор UPDATE не изменил ни одной строки.
Переменные SQLCODE и SQLSTATE очень часто используются в операторе while для завершения цикла и для выхода из него в случае возникновения ошибки.
Встроенный SQL поддерживает оператор WHENEVER, определяющий действия, которые будут выполнены при возникновении описанной ситуации. Этот оператор следует указывать до выполнения того SQL-оператора, чья обработка ошибок будет "перехватываться".
Оператор WHENEVER влияет на все выполняемые SQL-операторы.
Например:
EXEC SQL WHENEVER SQLERROR GOTO Err_1; EXEC SQL WHENEVER NOT FOUND CONTINUE; EXEC SQL WHENEVER SQLWARNING CONTINUE; EXEC SQL OPEN CURSOR c1; EXEC SQL FETCH c1 INTO :f1,:f2,:f3; : err_1: std::cout<<'' SQLERROR''; : EXEC SQL CLOSE CURSOR c1;
Оператор WHENEVER определяет или метку, на которую будет выполнен переход при возникновении ошибки, или действие типа CONTINUE (продолжение выполнения), или процедуру обработки ошибок.
Кроме использования
Эти элементы необходимы для неявного встраивания
На следующей схеме представлен процесс получения выполнимого приложения с использованием OCCI-библиотеки.
(рис 9.2) Процесс получения выполнимого приложения с использованием OCCI-библиотеки.Приведем пример приложения на языке С++, использующего OCCI-библиотеку для реализации операций вставки, извлечения данных, изменения и удаления данных.
Пример:
#include <iostream.h>
#include <occi.h> // Библиотека располагается
// в каталоге [ORACLE_HOME]\oci\include
using namespace oracle::occi; // Для доступа к пространству имен occi
using namespace std;
class occi_select
{
private:
Environment *env; // Переменная окружения
Connection *conn; // Переменная соединения
Statement *stmt; // Переменная оператора
public:
occi_select (string user, string passwd, string db) // Конструктор
{ // Соединение с БД
env = Environment::createEnvironment (Environment::DEFAULT);
conn = env->createConnection (user, passwd, db);
}
~occi_select () // Деструктор
{
env->terminateConnection (conn); // Освобождение соединения
Environment::terminateEnvironment (env);
}
// Добавление строки с динамическим связыванием
void insertRowBind(int c1, string c2)
{
string sqlStmt = "INSERT INTO tbl1 VALUES (:x, :y)";
stmt=conn->createStatement (sqlStmt);
try{
stmt->setInt (1, c1); // Определение значения для первого столбца
stmt->setString (2, c2);
stmt->executeUpdate ();
}catch(SQLException ex)
{ cout<<ex.getMessage() << endl; }
conn->terminateStatement (stmt); // Освобождение оператора
}
// Добавление строки в таблицу
void insertRow ()
{
string sqlStmt = "INSERT INTO tbl1 VALUES (6, 'ABC')";
stmt = conn->createStatement (sqlStmt);
try{
stmt->executeUpdate ();
}catch(SQLException ex)
{ cout<<ex.getMessage() << endl; }
conn->terminateStatement (stmt);
}
// Изменение строки
void updateRow (int c1, string c2)
{
string sqlStmt =
"UPDATE tbl1 SET f1 = :x WHERE f2 = :y";
stmt = conn->createStatement (sqlStmt);
try{
stmt->setString (1, c2);
stmt->setInt (2, c1);
stmt->executeUpdate ();
}catch(SQLException ex)
{ cout<<ex.getMessage() << endl; }
conn->terminateStatement (stmt);
}
// Удаление строки
void deleteRow (int c1, string c2)
{
string sqlStmt =
"DELETE FROM tbl1 WHERE f1= :x AND f2 = :y";
stmt = conn->createStatement (sqlStmt);
try{
stmt->setInt (1, c1);
stmt->setString (2, c2);
stmt->executeUpdate ();
}catch(SQLException ex)
{ cout<<ex.getMessage() << endl; }
conn->terminateStatement (stmt);
}
// Отображение всех строк
void displayResultSet ()
{
string sqlStmt = "SELECT f1, f2 FROM tbl1";
stmt = conn->createStatement (sqlStmt);
ResultSet *rs = stmt->executeQuery ();
try{
while (rs->next ())
{
cout << "f1: " << rs->getInt (1) << " f2: "
<< rs->getString (2) << endl;
}
}catch(SQLException ex)
{
cout<<"Error number: "<< ex.getErrorCode() << endl;
cout<<ex.getMessage() << endl;
}
stmt->closeResultSet (rs); // Освобождение результирующего набора
conn->terminateStatement (stmt);
}
}; // Конец кода класса occi_select
int main (void)
{
string user = "SCOTT";
string passwd = "TIGER";
string db = "";
occi_select *occi1 = new occi_select (user, passwd, db);
occi1-> displayResultSet (); // Отображение всех записей
occi1->insertRow (); // Вставка строки
occi1-> displayResultSet ();
occi1->insertRowBind(6, "ABC"); // Вставка строки с использованием
// динамического связывания
occi1-> displayResultSet ();
occi1->deleteRow (6, "ABC"); // Удаление строки
occi1->updateRow (4, "EEE"); // Обновление строки
occi1-> displayResultSet ();
delete (occi1); // Освобождение OCCI-объекта
}
В SQL-операторах могут использоваться переменные из прикладной программы.
Операторы:
- определяет запрос;
OPEN и CLOSE - начинает и завершает процесс обработки.
Приведем пример приложения, использующего
main()
// Включение структуры для обработки ошибок
{ EXEC SQL INCLUDE SQLCA;
// Объявление хост-переменных
// (связи и INTO-переменные)
EXEC SQL BEGIN DECLARE SECTION;
int NumIndID;
int NumID; // Эти переменные
// указываются после символа :
char Sal[10];
EXEC SQL END DECLARE SECTION;
// Обработка ошибок
EXEC SQL WHENEVER SQLERROR GOTO err_1;
EXEC SQL WHENEVER NOT FOUND GOTO err_2;
// Запрос параметров
printf ("Type individual number: ");
scanf("%d",NumIndID);
// Выполнение SQL запроса
EXEC SQL SELECT NumID, Sal FROM tbl1
WHERE NumIndID =: NumIndID
INTO :NumID, :Sal;
// Отображение результата
std::cout<< "Number: "<<NumID;
exit(0);
err_1:
std::cout<<'' SQLERROR'';
exit(1);
err_2:
std::cout<<'' NOT FOUND";
exit(1); }
Типы данных преобразуются автоматически для каждой СУБД.
СУБД возвращает информацию об ошибках через специальные SQLCA ), переменную SQLSTATE или SQLCODE.
Теперь рассмотрим более подробно синтаксис языка
Фактически, чтобы приложение могло обращаться к базе данных, существуют четыре основных варианта:
Встраиваемый SQL-оператор указывается после фразы .
На следующей схеме изображен процесс выполнения программы, содержащей операторы
(рис 9.1) Процесс выполнения программы, содержащей операторы встроенного SQL.На первом этапе исходный код обрабатывается прекомпилятором, иногда также называемым препроцессором. Интегрированные среды программирования включают в свой состав
прекомпиляторы для
Таким образом, выполнение SQL-оператора было последовательно заменено на вызов внешней процедуры, которая затем была связана с библиотекой СУБД. Поэтому на этапе выполнения библиотечные вызовы будут передаваться непосредственно СУБД.
При выполнении программы со встроенным SQL могут быть использованы привилегии как выполняющего, так и владеющего пользователя (того, кто создал выполнимый файл).
В современных коммерческих СУБД, как правило, относительно хранимых в базе данных модулей, существует возможность назначения привилегии EXECUTE таким образом, чтобы
при выполнении модуля использовались привилегии его владельца.
Во
При указании переменной основного языка программирования в коде SQL-оператора перед этой переменной следует вставлять символ двоеточия.
Перед тем как использовать такую переменную, она должна быть объявлена в разделе объявления SQL-переменных. Объявление SQL-переменных указывается
между парой операторов и .
В и
Например:
// Код для объявления переменных на языке С++:
EXEC SQL BEGIN DECLARE SECTION;
int var1;
int var2;
char var3[10];
EXEC SQL END DECLARE SECTION;
// Код для объявления переменных на языке Pascal:
EXEC SQL BEGIN DECLARE SECTION;
var;
var1: integer;
var2: integer;
var3: array (1..10) of char;
EXEC SQL END DECLARE SECTION;
SELECT сразу может указать имена переменных, в которые будут занесены результаты запроса.
Такие переменные называются
Для использования
Результирующий набор будет гарантированно возвращать только одну строку в следующих случаях:
PRIMARY KEY или UNIQUE ;GROUP BY отсутствует;SELECT однозначно определяют возвращаемую строку.Например:
EXEC SQL SELECT f1,f2,f3 FROM tbl1
INTO :var1, var2, var3 WHERE f1=1;
Имена INTO-переменных могут совпадать с именами полей, так как это разные идентификаторы, отличающиеся наличием у INTO-переменных символа "двоеточие".
WHERE для вычисления условия, в операторах INSERT и DELETE для определения устанавливаемых значений.
Например:
EXEC SQL INSERT INTO tbl2 (f1,f2,f3)
VALUES (:f1,:f2,:f3);
, в котором фраза FOR определяет запрос, ассоциируемый
с данным
Например, оператор
EXEC SQL DECLARE c1 CURSOR FOR
SELECT f1,f2,f3 FROM tbl1 WHERE f2>100;
создает c1 на базе таблицы tbl1. При OPEN CURSOR.
Например, оператор
EXEC SQL OPEN CURSOR с1;
создаст SELECT.
Приложение получает доступ к данным
Для извлечения данных из
Например, оператор
EXEC SQL FETCH c1 INTO :f1,:f2,:f3;
извлекает значения текущей строки
Для освобождения памяти, выделенной под CLOSE CURSOR.
Например:
EXEC SQL CLOSE CURSOR с1;
Для работы с NULL-значениями предусмотрены индикаторные переменные, которые могут использоваться для:
Если в результате выполнения оператора или оператора SELECT (возвращающего одну строку) извлекаемые данные
принимают значение NULL, то, во-первых, считается, что SQL-оператор выполнен с ошибкой, а во-вторых, в NULL (зависит от типа переменной). Для предотвращения таких ситуаций применяются индикаторные переменные,
указываемые после :). Если индикаторная переменная принимает отрицательное
значение, значит, столбец содержит значение NULL. По умолчанию до выполнения оператора индикаторной переменной присваивается значение 0.
Например:
Если в операторе INSERT или UPDATE требуется указать, что используемая NULL, то после этой переменной через двоеточие следует записать индикаторную переменную. В этом случае при отрицательном
значении индикаторной переменной в базу данных будет занесено значение NULL.
При фиксировании усекаемых строк в индикаторную переменную записывается первоначальная длина строки, а сама строка записывается в переменную основного языка с усечением.
DELETE и UPDATE может использоваться фраза WHERE CURRENT OF, определяющая,
что действие относится к текущей строке
UNION и ORDER BY ;Например:
EXEC SQL DECLARE c1 CURSOR FOR SELECT f1,f2 FROM tbl1;
EXEC SQL OPEN CURSOR c1;
EXEC SQL FETCH c1 INTO :f1,:f2;
EXEC SQL UPDATE tbl1 SET f2=f2*1.3
WHERE CURRENT OF c1;
DELETE удобно использовать для удаления из таблицы группы строк, предварительно выбранных в
SQLSTATE имеет тип char(5) и содержит информацию о классе (два старших символа) и подклассе (3 младших символа), описывающих состояние выполненного SQL-оператора;SQLCODE имеет Как и другие переменные, используемые во SQLSTATE и SQLCODE предварительно должны быть объявлены. Однако переменная SQLCODE может быть создана по умолчанию, если нет объявления другой переменной, получающей информацию о завершении выполнения SQL-оператора.
После выполнения SQL-оператора данные о статусе и коде выполнения автоматически записываются СУБД в эти переменные.
Статус выполнения SQL-оператора может быть определен как:
SQLSTATE коду '00000' (класс '00' ). SQLCODE в этом случае тоже равна 0;'02' в SQLSTATE определяет предупреждение 'NOT FOUND' ; класс состояния '01' указывает предупреждение, более точно специфицируемое подклассом;'03' и последующие в SQLSTATE описывают различные ошибочные ситуации (подклассы специфицируют как стандартные ситуации, так и определяемые приложением).Предупреждение 'NOT FOUND' указывает, что SQL-оператор не содержал ошибки, но не вернул ожидаемого результата. Например, сформированный результирующий набор не содержит ни одной строки, или оператор UPDATE не изменил ни одной строки.
Переменные SQLCODE и SQLSTATE очень часто используются в операторе while для завершения цикла и для выхода из него в случае возникновения ошибки.
Встроенный SQL поддерживает оператор WHENEVER, определяющий действия, которые будут выполнены при возникновении описанной ситуации. Этот оператор следует указывать до выполнения того SQL-оператора, чья обработка ошибок будет "перехватываться".
Оператор WHENEVER влияет на все выполняемые SQL-операторы.
Например:
EXEC SQL WHENEVER SQLERROR GOTO Err_1; EXEC SQL WHENEVER NOT FOUND CONTINUE; EXEC SQL WHENEVER SQLWARNING CONTINUE; EXEC SQL OPEN CURSOR c1; EXEC SQL FETCH c1 INTO :f1,:f2,:f3; : err_1: std::cout<<'' SQLERROR''; : EXEC SQL CLOSE CURSOR c1;
Оператор WHENEVER определяет или метку, на которую будет выполнен переход при возникновении ошибки, или действие типа CONTINUE (продолжение выполнения), или процедуру обработки ошибок.
Кроме использования
Эти элементы необходимы для неявного встраивания
На следующей схеме представлен процесс получения выполнимого приложения с использованием OCCI-библиотеки.
(рис 9.2) Процесс получения выполнимого приложения с использованием OCCI-библиотеки.Приведем пример приложения на языке С++, использующего OCCI-библиотеку для реализации операций вставки, извлечения данных, изменения и удаления данных.
Пример:
#include <iostream.h>
#include <occi.h> // Библиотека располагается
// в каталоге [ORACLE_HOME]\oci\include
using namespace oracle::occi; // Для доступа к пространству имен occi
using namespace std;
class occi_select
{
private:
Environment *env; // Переменная окружения
Connection *conn; // Переменная соединения
Statement *stmt; // Переменная оператора
public:
occi_select (string user, string passwd, string db) // Конструктор
{ // Соединение с БД
env = Environment::createEnvironment (Environment::DEFAULT);
conn = env->createConnection (user, passwd, db);
}
~occi_select () // Деструктор
{
env->terminateConnection (conn); // Освобождение соединения
Environment::terminateEnvironment (env);
}
// Добавление строки с динамическим связыванием
void insertRowBind(int c1, string c2)
{
string sqlStmt = "INSERT INTO tbl1 VALUES (:x, :y)";
stmt=conn->createStatement (sqlStmt);
try{
stmt->setInt (1, c1); // Определение значения для первого столбца
stmt->setString (2, c2);
stmt->executeUpdate ();
}catch(SQLException ex)
{ cout<<ex.getMessage() << endl; }
conn->terminateStatement (stmt); // Освобождение оператора
}
// Добавление строки в таблицу
void insertRow ()
{
string sqlStmt = "INSERT INTO tbl1 VALUES (6, 'ABC')";
stmt = conn->createStatement (sqlStmt);
try{
stmt->executeUpdate ();
}catch(SQLException ex)
{ cout<<ex.getMessage() << endl; }
conn->terminateStatement (stmt);
}
// Изменение строки
void updateRow (int c1, string c2)
{
string sqlStmt =
"UPDATE tbl1 SET f1 = :x WHERE f2 = :y";
stmt = conn->createStatement (sqlStmt);
try{
stmt->setString (1, c2);
stmt->setInt (2, c1);
stmt->executeUpdate ();
}catch(SQLException ex)
{ cout<<ex.getMessage() << endl; }
conn->terminateStatement (stmt);
}
// Удаление строки
void deleteRow (int c1, string c2)
{
string sqlStmt =
"DELETE FROM tbl1 WHERE f1= :x AND f2 = :y";
stmt = conn->createStatement (sqlStmt);
try{
stmt->setInt (1, c1);
stmt->setString (2, c2);
stmt->executeUpdate ();
}catch(SQLException ex)
{ cout<<ex.getMessage() << endl; }
conn->terminateStatement (stmt);
}
// Отображение всех строк
void displayResultSet ()
{
string sqlStmt = "SELECT f1, f2 FROM tbl1";
stmt = conn->createStatement (sqlStmt);
ResultSet *rs = stmt->executeQuery ();
try{
while (rs->next ())
{
cout << "f1: " << rs->getInt (1) << " f2: "
<< rs->getString (2) << endl;
}
}catch(SQLException ex)
{
cout<<"Error number: "<< ex.getErrorCode() << endl;
cout<<ex.getMessage() << endl;
}
stmt->closeResultSet (rs); // Освобождение результирующего набора
conn->terminateStatement (stmt);
}
}; // Конец кода класса occi_select
int main (void)
{
string user = "SCOTT";
string passwd = "TIGER";
string db = "";
occi_select *occi1 = new occi_select (user, passwd, db);
occi1-> displayResultSet (); // Отображение всех записей
occi1->insertRow (); // Вставка строки
occi1-> displayResultSet ();
occi1->insertRowBind(6, "ABC"); // Вставка строки с использованием
// динамического связывания
occi1-> displayResultSet ();
occi1->deleteRow (6, "ABC"); // Удаление строки
occi1->updateRow (4, "EEE"); // Обновление строки
occi1-> displayResultSet ();
delete (occi1); // Освобождение OCCI-объекта
}
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.