Базы данных - Cache - статьи

Работа с SQL GateWay на низком уровне


С SQL GateWay можно работать и на низком уровне, используя функции SQL Gateway API. Большинство функций SQL Gateway API инкапсулированы в классе %Library.SQLGatewayConnection, что несколько облегчает кодирование. Необходимо отметить, что %SQLGatewayConnection – это только часть всего того, что относится к SQL Gateway в Caché. В основном методы %SQLGatewayConnection соответствуют по названию и использованию соответствующим функциям API. Все методы класса %SQLGatewayConnection возвращают значение типа %Status, что позволяет осуществлять обработку ошибок. Рассмотрим отдельно некоторые методы.

Для соединения с ODBC-источником данных (DSN) используется метод Connect (DSN,User,Password): Set Connection=##class(%SQLGatewayConnection).%New()
// устанавливаем соединение
Do Connection.Connect(DSN, "User", "pwd")

Для разрыва соединения используется метод Disconnect(): Set sc=Connection.Disconnect() Прежде, чем выполнять запрос, необходимо сначала создать команду (Statement). Для создания команды используется метод AllocateStatement(), аргумент (Handle) методу AllocateStatement() передается по ссылке (перед именем аргумента ставится “.”): Set sc=Connection.AllocateStatement(.Stat)

Для удаления команды используется метод DropStatement(): Set sc=Connection.DropStatement(Stat)

Перед выполнением запроса его необходимо “подготовить”, для чего используется метод Prepare(Stat, sql). В качестве аргументов методу передается созданная команда и строка sql-запроса. Возможно выполнение запросов с параметрами, тогда в строке sql на месте параметров ставятся знаки “?”: //подготовка запроса
Set sc=Connection.Prepare
(Stat,"SELECT * FROM TABLE WHERE Name=? AND Age=?") Если передается sql-запрос с параметрами, то эти параметры необходимо подготовить и присвоить им определенные значения. Для подготовки параметров используется метод BindParameters(). Аргументы метода BindParameters():

  • созданная команда;
  • типы параметров: 1 – in (входной), 2-in/out (входной/выходной), 4-out (выходной);

  • cписок типов данных ODBC (например: 4-int, 9-DATETIME, 12-VARCHAR, 8-DOUBLE, …);

  • размеры буферов в байтах;


  • число знаков после точки (только для Decimal и Float);


  • список длин типов данных в байтах;


  • Все аргументы метода BindParameters(), начиная со второго имеют тип %List и должны передаваться в качестве аргументов функции $LB(). Если в запросе несколько параметров, то в качестве аргументов $LB() передаются значения через запятую, соответствующие каждому параметру в порядке их следования в строке запроса, например: Set sc=Connection.BindParameters(Stat,$LB(1,1),$LB(12,4),
    $LB(50,4),$LB(0,0),$LB(50,4))

    Значение нужного типа данных ODBC можно посмотреть в глобале ^%qCacheSQL (область %CACHELIB) по первому индексу равному "odbcdt", тогда второй индекс соответствует нужному типу данных (Рис. 11).

    Присваивание значения параметру осуществляется с использованием метода SetParameter(Stat, $LB(val), Numb). В качестве аргументов методу SetParameter() передаются:


    • созданная команда;


    • значение параметра как аргумент функции $LB();
    • порядковый номер параметра в строке запроса.


    Метод SetParameter() вызывается отдельно для каждого переданного параметра: Set sc=Connection.SetParameter(Stat,$LB(“Alice”),1)
    Set sc=Connection.SetParameter(Stat,$LB(5),2) Для выполнения запроса используется метод Execute(Stat), которому в качестве аргумента передается созданная команда: Set sc=Connection.Execute(Stat)В Листинге 3 приведен пример запроса к внешней таблице с использованием методов класса %Library.SQLGatewayConnection. Данный запрос выбирает все поля из таблицы INFO внешнего ODBC-источника (с именем DSNName), для которых значение поля Age=21, а значение поля Name начинается с буквы “D”.

    Листинг 3 Set Connection=##class(%SQLGatewayConnection).%New()
    // устанавливаем соединение
    Do Connection.Connect("DSNName","sa","pwd")
    // создание новой команды
    Set sc=Connection.AllocateStatement(.Stat)
    // подготовка запроса
    Set sc=Connection.Prepare(Stat,"SELECT * FROM INFO WHERE
    Age=? AND Name LIKE ?")
    // подготовка параментов
    Set sc=Connection.BindParameters(Stat,$LB(1,1),$LB(4,12),
    $LB(4,50),$LB(0,0),$LB(4,50))
    Set sc=Connection.SetParameter(Stat,$LB(21),1)
    Set sc=Connection.SetParameter(Stat,$LB("D%"),2)
    // выполнение запроса
    Set sc=Connection.Execute(Stat)
    For { Q:'Connection.Fetch(Stat)
             S Sc=Connection.GetOneRow(Stat,.Row)
             For J=1:1:$LL(Row) Write $LG(Row,J)_" "
             Write !

    }
    // удаление команды
    Set sc=Connection.DropStatement(Stat)
    // разрыв соединения
    Set sc=Connection.Disconnect()


    Содержание раздела