Стандарт объектно-ориентированного структурированного языка запросов

OSQL 200N v 0.0.0.1 (глубокая альфа).

 

  Банников Н.А. www.stikriz.narod.ru Почта На главную страницу  

Автор статьи(не подумайте, что стандарта...): Банников Николай Александрович

Почта

www.stikriz.narod.ru

Введение. 1

О первичных ключах. 2

Select. 2

Формирование секции From. 2

Формирование секции Select. 2

Формирование секции Where. 3

Insert. 3

Update. 3

 

Введение.

Для начала, разберемся со структурой класса в ООБД[1]. Класс в ООБД мало чем отличается от класса в языках C++ или Object Pascal. Вот типичная структура в синтаксисе Object Pascal:

 

MyClass = class(MyParentClass)

            private

                        // Секция приватных определений членов класса

            protected

                        // Секция защищенных определений членов класса

            public

                        // Секция публичных определений членов класса

                        function GetOID: TOID;

                        property OID: TOID … read GetOID; // Read only;

            published

                        // Секция опубликованных определений членов класса

end;

 

Область видимости такая же, как и в обычных языках программирования, а именно:

  1. Приватные данные видны только внутри методов данного экземпляра объекта.
  2. Защищенные – то же самое, но доступны и в потомках.
  3. Публичные видны другим объектам, процедурам и функциям.
  4. Опубликованные – то же самое, но только они сохраняют свое состояние в БД.

 

Итак, секция published – это то, что в реляционных БД является полями таблицы. Select, Insert, Update можно составить для секции public и published и именно эти секции будут интересовать нас в большей степени чем остальные. Реализация TOID не регламентируется. Это может быть, например, целое число или GUID. Главное, что это уникальный идентификатор объекта (экземпляра класса) в рамках информационного пространства, охватываемого системой. Система самостоятельно должна генерировать OID при создании нового экземпляра класса.

Надо понимать, что в БД гарантированно сохранят свое состояние только property, указанные в секции published, а в секции public только до тех пор, пока открыта транзакция. Однако, методы доступа к этим property могут сохранять данные в каком-нибудь другом поле в БД – это отдается на откуп разработчику класса.

О первичных ключах.

В ООБД не может быть другого первичного ключа, кроме как OID объекта. Если Вам нужно достичь такого же эффекта, как при естественных ключах в реляционной БД, то просто сделайте уникальный индекс по нужным полям. Итак, в ООБД все первичные ключи суррогатные и представляют собой OID объекта.

Select.

Select Запрос на выборку данных из одного или нескольких объектов начинается с ключевого слова Select. Возвращает набор данных в виде таблицы. Сразу за ключевым словом Select следует перечисление, составленное из имен полей[2] или методов через запятую, возвращающих значение т.е. функций класса.

From. За ключевым словом From следует перечисление имен классов через запятую, которые участвуют в запросе.

Where. За ключевым словом Where следует условие по которому осуществляется отбор данных.

Пока, все так же, как и в обычном SQL. Теперь, займемся объектно-ориентированными расширениями синтаксиса стандартного языка запросов.

Формирование секции From.

В секции From мы должны указать имена классов объектов, которые участвуют в запросе. Вы можете указать просто имя класса, например, from MyClass. И будут выбираться данные, которые принадлежат именно классу MyClass. Вы можете перечислить один или несколько классов, которые являются потомками одного[3], например, если MyParentClass является предком для классов MyFirstClass и MySecondClass, то вы можете оформить секцию from в таком виде: from MyParentClass(MyFirstClass, MySecondClass) или MyParentClass(MyParentClass, MyFirstClass, MySecondClass). Эта запись означает, что данные из  объектов разных классов при выполнения select будут рассматриваться как MyParentClass. Это одно имя как бы таблицы. Так же как в стандартном SQL допускается определять алиасы, например, MyParentClass(MyFirstClass, MySecondClass) D1. Важно, чтобы имена классов в скобках для приведения типов входили в цепочку наследования того класса, к которому они приводятся.

Формирование секции Select.

В секции Select Вы можете указывать имена полей или функций класса. При этом, эти поля и функции, если Вы используете приведение типов, обязательно должны существовать в классе, к которому Вы приводите, пусть даже абстрактные, но должны быть и конечно, одинаково объявлены. Точно так же, как в обычном SQL, Вы можете задавать алиасы отдельным полям с помощью ключевого слова as или просто через пробел. Функциям можно передавать значения параметров. Значения параметров могут быть либо константами, либо полями, выбранными в этом же запросе, например:

 

Select D1.MyProperty1 P1, D1.MyFunction1(2, 3, P1) P2, D2.MyProperty2 P3

From MyParentClass(MyFirstClass, MySecondClass) D1, MyThirdClass D2

Where

 

Имена полей, значение которых берется как результат исполнения функции класса по умолчанию совпадают с именем функции. Приведение типов данных такое же как и в стандартном SQL. Стоит отметить, что тип TOID ни к чему не приводится. Нельзя приводить его к какому-нибудь классу или другому типу данных. Вы можете только сравнивать два значения OID. Т.е. Вы не можете в запросе в качестве поля вернуть объект, а только его OID. Для этого, Вам нужно делать еще один запрос, в котором, например, в секции where использовать полученный OID.

Формирование секции Where.

Ничем не отличается от стандартного языка SQL.

Insert.

Точно так же, как и в Select в секции From, Вы можете в секции Into указывать не только имя конкретного класса, но и приводить один или несколько классов к классу-предку. Например, Insert Into MyParentClass(MyFirstClass, MySecondClass) ( … ) values ( … ). Тогда данные будут вставляться сразу в несколько классов одним запросом. В первых скобках Вы должны указывать только property из секции public или published. Во вторых скобках – присваиваемые им значения.

Update.

Точно так же, как и в Select в секции From, Вы можете использовать приведение типа объекта, чтобы делать update сразу нескольким типам данных. Например:

update MyParentClass(MyFirstClass, MySecondClass) set Prop1 =  Val1 … where


 

[1] Объектно-ориентированная база данных.

[2] Или property

[3] Полиморфизм.

 

     Банников Н.А. www.stikriz.narod.ru почта 2003 г.

 

Сайт создан в системе uCoz