SQL в CACHE
Американский институт национальных стандартов ANSI и международная организация стандартов ISO занимаются описанием и поддержкой стандартов языка SQL. Все современные языки БД поддерживают этот стандарт, то есть отклонения, которые в каждом конкретном случае описываются в документации программного продукта, кроме того в большинстве систем разработано расширение языка SQL которые дают возможность использовать язык запросов в среде программирования. Возможности языка SQL: · Создавать и удалять таблицы БД, изменять заголовки этих таблиц · Вставлять, изменять, удалять картежи таблицы · Выполнять поиск данных в таблице и выполнять сортировку этого поиска · Описывать процедуры поддержки целостности данных · Определять и изменять информацию о защите данных Эта система поддерживает все элементы ANSI. Эти элементы можно разделить на 3 основных области и 2 дополнительных: 1. DQL – язык, использующийся для запроса данных 2. DМL – язык для обработки данных 3. DDL – для определения структур данных 4. TCL – для управления транзакциями 5. DСL – для регулирования доступа к данным и использования прав доступа К DQL относятся: SELECT*|{[DISTINCT|ALL]выражение,…} FROM{имя таблицы[псевдоним]},… [WHERE логическое выражение] [GROUP BY {имя столбца|целое число},…] [HAVING логическое выражение] [ORDER BY{имя столбца|целое число},…] К DМL относятся: 1. INSERT INTO имя таблицы[(имя столбца,…)] {VASUES(выражение,…)} |запрос Пример: INSERT INTO User.Person(Surname,Name) VASUES(“Петров”,”Иван”) 2. UPDATE имя таблицы SET имя столбца= выражение,… [WHERE логическое выражение]
Пример: UPDATE User.Person SET Surname = “Степанов”, Name=”Александр” WHERE ID=42
3. DELETE FROM имя таблицы [WHERE логическое выражение]
Пример: DELETE FROM User.Person WHERE ID=42 К DDL относятся: 1. CREATE TABLE имя таблицы (Имя столбца Тип данных [(Размер)] [Not Null],…) 2. ALTER TABLE имя таблицы {DROP Имя столбца} |{ADD Имя столбца Тип данных [(Размер)] [Not Null],…} | {MODIFY Имя столбца Тип данных [(Размер)] [Not Null],…} //ALTER имя таблицы – изменяет таблицу //DROP TABLE имя таблицы – удаляет описание таблицы с потерей всех данных 3. CREATE VIEW имя представления [(Имя столбца),…] AS запрос 4. DROP VIEW имя представления 5. ALTER VIEW имя представления [(Имя столбца),…] AS запрос 6. CREATE [UNIQUE] INDEX ON имя таблицы (Имя столбца,…) 7. ALTER [UNIQUE] INDEX Имя индекса ON имя таблицы (Имя столбца,…) 8. DROP INDEX Имя индекса DO $SYSTEM.Security.Login(“_System”,”SYS”) NEW SQLCODE, %msg &sql(CREATE TABLE Employee EMPNUM INT NOT NULL, NAME LAST CHAR(30) NOT NULL, … CONSTRAINT ENPLOUYEEPK PRIMARY KEY (EMPNUM) ) IF CODE=0 {WRITE!,”Таблица создана”} ELSE {w!, “SQLCODE=”, SQLCODE,”: ”,%msg}
SET q1 = “SELECT TOP 10 P.ID AS ID P.Name AS pn, E.Name AS en” SET q2 = ” From Sample.Person AS P, Sample.Employee AS E” SET myquery = q1_q2 SET rset= #class(%ResultSet).%New(“%DynamicQuery:SQL”) SET sc = rset.Prepare(myquery) SYY = sc = rset.Execute() WHILE rset.Next() {w!, rset.Data(“pn”),!,rset.Data(“en”) SET IDPers=rset.Data(“ID”)} w!,”RowCount=”,%RowCount
ПЕРЕДАЧА ПАРАМЕТРА: SET=myquery=”SELECT ID, Name, Age FROM Sample.Person WHERE Age>? AND Age<?” SET rset=#class(%ResultSet. SQL).%Prepare(myquery,.err, “ ”, 21,26) WHILE rset.Next() {w!,rset.Name, “, ”, rset.Age}
24.04.15 ПРИМЕР 1: SET sql=3 SET sql(1)=”DECLARE @var INT” SET sql(2)=”SET @var=4” SET sql(3)=”SELECT TP @var Name, Age FROM Sample.Person” SET statement=##class(%SQL.statment).%New() SET statement.%Dialect=”MSSQL” SET Status=statement.%Prepare(.sql) SET result=statement.%Execute() DO result.%Display()
На терминале получаем: Name Age Сидоров 50 Петров 40 2 Rows Affected
ПРИМЕР 2: S tSQL=3 S tSQL(1)=”select %ID as id, Name, DOB, Home_State as Home, Age” S tSQL(2)=”from Sample.Person where Age>? And Home [?” S tSQL(3)=”order by 2” S tStat=##class(%SQL.Statment).%New() S tStatus=tStat.%Prepare(.tSQL) S tRes=tStat.%Execule(50,”VT”) WHILE tRes.%Next(){w!,”Имя”, t.Res.Name, “ Home”, tRes.Home, “ Возраст”, tRes.Age, “ День рождения”, $zdt(tRes.DOB,4)} DO tRes.%Display()
Id Name DOB Home 3 Сидоров И.П. 9/4/1969 VT 5 Петров А.П. 8/12/2003 VT 2 Rows Affected
ПРИМЕР 3: Если запрос определен в классе SET tSp=##class(%SQL.Statement).%New() SET tStatus=tSp.%PrepareClassQuery(“Sample.Person”,”Doctest”) SET tRes=tSp.%Execute() WHILE t.Res.%Next() { }
ПРИМЕР 4: Непосредственно указываем сам запрос S tRes=##class(%SQL.Statment).%ExecDirect (.tStatment, “select Name, Age from Sample.Person where Age>? And Name=?”, 50, “Александр”) DO tRes.%Display() Свойство Age вычисляемо с помощью Sql запросов: Property Age AS %Integer[Calculated, SqlComputCode={set {Age}=##class(Sample.Person).CurrentAge({DOB})}, SqlComputed, SqlChange=DOB]; Используется метод CurrentAge(), которое имеет следующий вид: ClassMethod CurrentAge(date As %Date=” ”) As %Integer [CodeMode=expression] { $Select date=”:”,1:($zd($h,8)-$D(date,8)\10000) } 30.04.15 В каше можно создать дополнительные функции которые можно представить как методы класса и обозначить как SqlProc. User.Person Property Name As %String [Required] Property SNN As %String [Required] Index Key on (SNN, Name) [IdKey, PrimaryKey, Unique]
ClassMethod Reverse (Arg1 As %String) As %String [SqlName=Reverse, SqlProc] { S rez = $Reverse(Arg1) &sql (select ID, Name, SNN from Sample.Person WHERE Name [:rez) }
Как использовать SqlProc: SELECT SQLUser.Reverse(Name) NoName FROM SQLUser.Person
ClassMethod AA { &sql(Key) } Если после выполнения sql-запроса необходимо получить ID картежа: ClassMethod Find (name As %String) As ObjectHandle { &sql (select %ID into:id FROM Sample.Person WHERE Name=:name) If SQLCODE<0 Quit “” Quit..%OpenId(id) //=0 sql успешно завершен; =100 sql успешно завершен, но более не найдено результатов; <0 ошибка выполнения запроса } Метод записи конкретного экземпляра в таблицу с использованием sql: ClassMethod Insert (name, SNN As %String) As %String { &sql (Insert Into Sample.Person (Name, SNN) values(:name,:snn)) If SQLCODE<0 write!, “SQLCODE=”, SQLCODE Quit $$$OK }
|