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

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

Просмотров: 35683
Дата последнего изменения: 22.01.2024
Татьяна Старкова
Сложность урока:
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()”.

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


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

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