19
Программируемый клиент ORACLE Технология Pro C/C++

Программируемый клиент ORACLE

Embed Size (px)

DESCRIPTION

Программируемый клиент ORACLE. Технология Pro C/C++. Два вида программного интерфейса. Предкомпилятор CALL - интерфейс. СПРАВОЧНИК ВЫЗОВОВ Call – интерфейс требует детального знания процедур и функций : названия ; количество пар-ров; тип параметров; знание кодов возврата; - PowerPoint PPT Presentation

Citation preview

Page 1: Программируемый клиент  ORACLE

Программируемый клиент ORACLE

Технология Pro C/C++

Page 2: Программируемый клиент  ORACLE

Два вида программного интерфейса

• Предкомпилятор

• CALL- интерфейс

Page 3: Программируемый клиент  ORACLE

Достоинства и недостатки подходов

СПРАВОЧНИК ВЫЗОВОВ

Call –интерфейс требует детального знания процедур и функций:

• названия;

• количество пар-ров;

• тип параметров;

• знание кодов возврата;

• обработка исключительных ситуаций;

• и т.п.

Время и трудозатраты на разработку - возрастает

ПРЕДКОМПИЛЯТОР

Использовать проще:

• наглядность;

• понятность;

• структурированность

Однако, мобильность программ – меньше, так как требуется предкомпилятор Oracle, позволяющий строить код исходной программы на С/С++, Fortran, Ada, Cobol, Pascal и др.

Page 4: Программируемый клиент  ORACLE

Возможности предкомпиляции

• Один вызов к Oracle автоматически преобразуется в несколько вызовов процедур(функций).

• Одна программа может применяться для работы с разными БД

• Несколько программ могут быть отдельно предкомпилированы и совместно выполнены (собраны).

Page 5: Программируемый клиент  ORACLE

Этапы разработки приложений

В ы п о л не н и е п ро гр а м мы

С б о р ка об ъ е ктн ы х ф а й л овс п о д кл ю ч е н и е м би б л и о те к O R A C LE

(* .e xe )

К о м п и л я ц и я и схо д н и ка н а С /С ++л ю б ы м ко м п ил л я то р о м стан д а р та A N S I

П р е д ко м п и л я ц и я п р о гр а м мыв ф а й л н а С /С ++

(* .c и л и * .cp p)

С о зд а н и е п р о гр а м мын а P ro C /C + +

(* .p c )

отладка

Page 6: Программируемый клиент  ORACLE

Правила и соглашения технологии Pro C/C++

• В программу на Pro C/C++ может быть включен любой оператор SQL

• Перед всеми операторами SQL ставится префикс EXEC SQL• ( для некоторых уникальных конструкций EXEC ORACLE).

• Операторы SQL делятся на декларативные и выполняемые.

• После исполнения выполняемых операторов коды возврата заносятся в SQLCA

• Декларативные операторы не изменяют SQLCA

Page 7: Программируемый клиент  ORACLE

Структура программы на Pro C/C++

С е кц и яD E C L A R E

F R E E M E M O R Y D IS C O N N E C T

Э п и л о гп р о гр а м мы

Т е л о п р о гр а м мыО б р а щ е н и е к O R A C L E S E R V E R ,

д е й ств и я с п е р ем е н н ы ми

П р о л огп р о гр а м мы

IN C L U D ES Q L C A

C O N N E C T

Page 8: Программируемый клиент  ORACLE

Секция DECLARE

• Единственная

• Может иметь локальную или глобальную видимость

EXEC SQL BEGIN DECLARE SECTION;

Описание переменных обмена данными

EXEC SQL END DECLARE SECTION;

Page 9: Программируемый клиент  ORACLE

Пример

EXEC SQL BEGIN DECLARE SECTION;Int n,no;Char name[11];EXEC SQL END DECLARE SECTION;Void main(){…………

EXEC SQL select id, fio into :n,:name from personal where num_o = :no;

Для отличия переменных от атрибутов в SQL запросах используется символ ‘:’, перед именем переменной.

Page 10: Программируемый клиент  ORACLE

Для строк переменной длины в секции DECLARE используется специальный тип VARCHAR.

ПримерVARCHAR j[40];

Автоматически порождаетсяStruct { unsigned short int len; unsigned char arr[40];} j;

Можно использовать в программеj.len – фактическая длина стрингаj.arr – указатель на массив содержимого

Page 11: Программируемый клиент  ORACLE

INCLUDE SQLCA

• EXEC SQL INCLUDE SQLCA;

Область SQLСA содержит:

- флаги предупреждений;

- информацию о событиях;

- коды ошибок;

- текст диагностики ошибок;

- и др. служебную информацию.

Page 12: Программируемый клиент  ORACLE

Пример

…..If( sqlca.sqlcode == 0 ) continue; //успешное завершение sql else if( sqlca.sqlcode < 0 ) cout << “Ошибка выполнения”; else cout << “ Выбрана последняя строка”;

Page 13: Программируемый клиент  ORACLE

CONNECT

Соединение с ORACLE Server

EXEC SQL CONNECT :oralogpass;

Page 14: Программируемый клиент  ORACLE

Пример

EXEC SQL BEGIN DECLARE SECTION;Varchar oralogpass[40];EXEC SQL END DECLARE SECTION;………Strcpy(oralogpass.arr,”o01/o01”);oralogpass.len=strlen(oralogpass.arr);

EXEC SQL CONNECT :oralogpass;………….

Page 15: Программируемый клиент  ORACLE

Тело программы

• Cтандартные операторы языка C/C++ ;• Операторы SQL (select,delete,insert,update);• Контроль распределенной обработки данныхEXEC SQL DECLARE <имя> STATEMENT;

• Связь и управление распределенной БДEXEC SQL DECLARE <имя> DATABASE;

• Изменение стандартных установок EXEC ORACLE OPTION ( option=значение );

Page 16: Программируемый клиент  ORACLE

Множественный и единичный выбор с использованием массивов м указателей.

Оператор массив(указатель) простая переменнаяSelect заголовок можно можноSelect .. Where нельзя можноInsert.. Values() можно можноUpdate .. Set.. where можно однов. можно однов.

Page 17: Программируемый клиент  ORACLE

Примеры

EXEC SQL BEGIN DECLARE SECTION;char name[100][100];int n[100];Float sal[100];EXEC SQL END DECLARE SECTION;……..EXEC SQL SELECT fio,id into :name,:n FROM personal; // ok!EXEC SQL SELECT fio,id into :name,:n FROM personal WHERE many = :sal; // неверный операторEXEC SQL INSERT INTO personal(fio,id,many) VALUES(:name, :n, :sal); // ok!EXEC SQL UPDATE SET many = :sal WHERE id = :n; //ok!EXEC SQL UPDATE SET many = :sal WHERE id = :n[0]; // no!

Page 18: Программируемый клиент  ORACLE

Оператор COMMIT WORK завершает транзакцию

EXEC SQL COMMIT WORK;

Оператор COMMIT WORK RELEASE осуществляет DISCONNECT

EXEC SQL COMMIT WORK RELEASE;

Page 19: Программируемый клиент  ORACLE

Пример программы, которая позволяет задать ( с клавиатуры ) номера сотрудников и их оклады, а затем добавляет эти данные в таблицу#include <stdio.h>#include <string.h>EXEC SQL BEGIN DECLARE SECTION;varchar log_pass[40];int loop,n[100];float many[100];EXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE sqlca.h;main() { int i,ret; strcpy(log_pass.arr,”o01/o01@stud”); log_pass.len = strlen(log_pass.arr);EXEC SQL CONNECT :log_pass;for(i=0;i<100;i++) { ret=scanf(“%d %f\n”, &n[i],&many[i]); if(ret == EOF|| ret ==0|| n[i]==0) break;} loop=i; EXEC SQL FOR :loop INSERT INTO sotrud (Tnum,okl) VALUES(:n,:many); EXEC SQL COMMIT WORK RELEASE;}