Как выполнить хранимые процедуры в drupal?

9

У меня есть веб-сайт, который много работает с финансовыми данными. Он включает операции с большими объемами данных большую часть времени. Поэтому я считаю полезным выполнять эти операции в хранимых процедурах MySQL. Я сохранил процедуры в моей базе данных. Я хочу знать, как я могу выполнить хранимые процедуры в drupal? Есть ли хороший метод для выполнения хранимых процедур в drupal? Как drupal вообще обрабатывает хранимые процедуры? Или мы просто должны использовать PHP для выполнения хранимых процедур?

Махеш Бхат
источник
Вы искали в Интернете? Google возвращает некоторые результаты для «хранимых процедур drupal», которые кажутся интересными. Вы пробовали код? Можете ли вы сказать нам, что сработало, а что нет?
marcvangend
1
Да, я сделал поиск в Google. Кажется, для выполнения одной хранимой процедуры с параметрами требуется несколько строк кода. Есть ли в Drupal API вспомогательная функция для выполнения хранимых процедур?
Махеш Бхат

Ответы:

11

Предполагая, что вы используете Drupal 7, вы можете использовать код, подобный следующему:

// Get the Drupal database connection and change the statement class to PDOStatement.
// Save the current class for cleanup later.
$conn = Database::getConnection();
$saved_class = $conn->getAttribute(PDO::ATTR_STATEMENT_CLASS);
$conn->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatement'));

// Prepare the statement and bind params
$statement = $conn->prepare("Call GetNodeList(?,?)");

$op_status = $statement->bindParam(1, $node_type, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 25);
$op_status = $statement->bindParam(2, $publish_state, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT);

// Execute the statement and reset the connection's statement class to the original.
$exec_result = $statement->execute();
$conn->setAttribute(PDO::ATTR_STATEMENT_CLASS, $saved_class);

// Get your data
while ($row = $statement->fetchColumn(0)) {
  // ...
}

Этот метод полностью взят из этой статьи и хорошо работал в прошлом.

Клайв
источник
спасибо, что выбрал это! страница, на которую ссылается «эта статья», не разрешается.
cdmo
0

Не уверен, что это правильный путь к этому, но это сработало для меня. У меня есть устаревшая система, которая использует тот же сервер баз данных Postgres, что и Drupal.

В обработчике отправки мне нужно было отправить данные в эту унаследованную систему, в которой была хранимая процедура (Postgres вызывает их функции) для обработки данных:

// Get legacy database connection set-up in settings.php
Database::getConnection('default', 'legacy')
  ->query('SELECT * FROM stored_procedure(:named_parameter_1, :named_parameter_2, ...);', [
    ':named_parameter_1' => $value_1,
    ':named_parameter_1' => $value_2,
    ...
  ]);

Это успешно доставило данные в мою прежнюю систему

Колин Шиптон
источник