Wie führe ich gespeicherte Prozeduren in Drupal aus?

9

Ich habe eine Website, die viel an Finanzdaten arbeitet. Meistens werden große Datenmengen bearbeitet. Daher finde ich es nützlich, diese Operationen in gespeicherten MySQL-Prozeduren auszuführen. Ich habe Prozeduren in meiner Datenbank gespeichert. Ich möchte wissen, wie ich gespeicherte Prozeduren in Drupal ausführen kann. Gibt es eine gute Methode, um gespeicherte Prozeduren in Drupal auszuführen? Wie geht drupal generell mit gespeicherten Prozeduren um? Oder müssen wir nur das PHP verwenden, um gespeicherte Prozeduren auszuführen?

Mahesh Bhat
quelle
Haben Sie das Web durchsucht? Google gibt einige Ergebnisse für "Drupal-gespeicherte Prozeduren" zurück, die interessant erscheinen. Hast du den Code ausprobiert? Können Sie uns sagen, was funktioniert hat und was nicht?
Marcvangend
1
Ja, ich habe in Google gesucht. Es scheint wenige Codezeilen zu benötigen, um eine einzelne gespeicherte Prozedur mit Parametern auszuführen. Gibt es eine Hilfsfunktion in der Drupal-API, um gespeicherte Prozeduren auszuführen?
Mahesh Bhat

Antworten:

11

Angenommen, Sie verwenden Drupal 7, können Sie Code wie den folgenden verwenden:

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

Diese Methode wurde vollständig aus diesem Artikel entfernt und hat in der Vergangenheit für mich gut funktioniert.

Clive
quelle
Danke, dass du es ausgesucht hast! Die Seite, auf die mit "dieser Artikel" verwiesen wird, wird nicht aufgelöst.
CDMO
0

Ich bin mir nicht sicher, ob dies der richtige Weg ist, aber es hat bei mir funktioniert. Ich habe ein Legacy-System, das denselben Postgres-Datenbankserver wie Drupal verwendet.

In einem Submit-Handler musste ich Daten an dieses Legacy-System senden, das eine gespeicherte Prozedur hatte (Postgres nennt sie Funktionen), um die Daten zu verarbeiten:

// 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,
    ...
  ]);

Dadurch wurden die Daten erfolgreich in mein Altsystem übertragen

Colin Shipton
quelle