176  /  382
Справочник

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

Просмотров: 22044
Дата последнего изменения: 27.10.2020
Татьяна Старкова
Сложность урока:
4 уровень - сложно, требуется сосредоточиться, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

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()”.

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


Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии