Jak wykonać procedury przechowywane w Drupal?

9

Mam stronę internetową, która zajmuje się wieloma danymi finansowymi. Obejmuje to operacje na dużych ilościach danych przez większość czasu. Dlatego uważam za użyteczne wykonywanie tych operacji w procedurach przechowywanych w mysql. Mam procedury składowane w mojej bazie danych. Chcę wiedzieć, jak mogę wykonać procedury przechowywane w Drupal? Czy jest jakaś dobra metoda wykonywania procedur przechowywanych w Drupal? Jak Drupal ogólnie obsługuje procedury przechowywane? A może po prostu musimy używać PHP do wykonywania procedur przechowywanych?

Mahesh Bhat
źródło
Czy przeszukiwałeś Internet? Google zwraca wyniki dla „przechowywanych procedur drupal”, które wydają się interesujące. Próbowałeś kodu? Czy możesz nam powiedzieć, co działało, a co nie?
marcvangend
1
Tak, szukałem w google. Wydaje się, że potrzeba kilku wierszy kodu do wykonania pojedynczej procedury składowanej z parametrami. Czy w API Drupala jest jakaś funkcja pomocnicza do wykonania procedury składowanej?
Mahesh Bhat

Odpowiedzi:

11

Zakładając, że używasz Drupala 7, możesz użyć kodu w następujący sposób:

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

Ta metoda jest całkowicie wyjęta z tego artykułu i działała dla mnie dobrze w przeszłości.

Clive
źródło
dzięki za unicestwienie go! strona, do której odwołuje się „ten artykuł”, nie rozwiązuje się.
cdmo
0

Nie jestem pewien, czy jest to właściwy sposób, ale zadziałało to dla mnie. Mam starszy system, który korzysta z tego samego serwera bazy danych Postgres, co Drupal.

W module obsługi przesyłania musiałem przesłać dane do tego starszego systemu, który miał procedurę składowaną (Postgres nazywa je funkcjami) do obsługi danych:

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

Dzięki temu dane z powodzeniem trafiły do ​​mojego starszego systemu

Colin Shipton
źródło