Перейти к содержанию

Выбор данных из хранимых процедур вместо таблиц

Тему урока можно изучить в новом формате — в документации по Bitrix Framework. В ней улучшена структура, описание, примеры.

ORM подходит даже для таких экзотических запросов, как выборка данных не из таблицы, а из хранимых процедур. Такие процедуры могут быть созданы в MSSQL-базе данных.

Укажем название функции в методе getTableName:

public static function getTableName()
{
    // return "foo_table_name"
    return "foo_table_procedure()";
}

В этом виде такой код работать не будет. Дело в том, что при использовании подключения Bitrix\Main\DB\MssqlConnection все вхождения имен таблиц проходят через экранирование. Попытка сразу выполнить такой запрос приведет к выбрасыванию исключения:

MS Sql query error: Invalid object name 'foo_table_procedure()'. (400)

SELECT

[base].[bar] AS [BAR],

[base].[baz] AS [BAZ],

FROM [foo_table_procedure()] [base]

Получению нужного результата мешают только знаки [ и ], которыми MssqlSqlHelper защитил имя "таблицы". Проблема решается созданием собственного подключения Connection и SqlHelper.

Вариант решения: на сервер установите расширение mssql и реализуйте следующую архитектуру:

class MssqlSqlHelper extends Bitrix\Main\DB\SqlHelper
{
    public function quote($identifier)
    {
        if (self::isKnowFunctionalCall($identifier))
        {
            return $identifier
        }
            else
        {
            return parent::quote($identifier);
        }
    }
}

Где self::isKnownFunctionCall - метод проверки, который возвращает true, если в $identifier находится “foo_table_procedure()”.

Примечание: Пример разработан компанией Интерволга.