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


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

 9
Author: Adrian Cid Almaguer, 2012-05-30

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)) {
  // ...
}

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

 11
Author: Clive, 2019-07-17 16:14:04

Не уверен, что это правильный путь к этому, но для меня это сработало. У меня есть устаревшая система, которая использует тот же сервер базы данных 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,
    ...
  ]);

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

 0
Author: Colin Shipton, 2018-01-30 11:03:02