Как выполнять хранимые процедуры в drupal?
У меня есть веб-сайт, который много работает с финансовыми данными. В большинстве случаев это связано с операциями с большими объемами данных. Поэтому я считаю полезным выполнять эти операции в хранимых процедурах mysql. У меня есть хранимые процедуры в моей базе данных. Я хочу знать, как я могу выполнять хранимые процедуры в drupal? Есть ли какой-нибудь хороший метод для выполнения хранимых процедур в drupal? Как drupal обрабатывает хранимые процедуры в целом? Или мы просто должны использовать PHP для выполнения сохраненных процедуры?
2 answers
Предполагая, что вы используете 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)) {
// ...
}
Этот метод полностью взят из этой статьи и хорошо работал для меня в прошлом.
Не уверен, что это правильный путь к этому, но для меня это сработало. У меня есть устаревшая система, которая использует тот же сервер базы данных 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,
...
]);
Это успешно перенесло данные в мою устаревшую систему