Comment exécuter des procédures stockées dans Drupal?

9

J'ai un site Web qui fait beaucoup de travail sur les données financières. Cela implique la plupart du temps des opérations sur de gros volumes de données. Par conséquent, je trouve utile de faire ces opérations dans les procédures stockées mysql. J'ai stocké des procédures dans ma base de données. Je veux savoir comment exécuter des procédures stockées dans Drupal? Existe-t-il une bonne méthode pour exécuter des procédures stockées dans Drupal? Comment drupal gère les procédures stockées en général? Ou nous devons simplement utiliser le PHP pour exécuter des procédures stockées?

Mahesh Bhat
la source
Avez-vous cherché sur le Web? Google renvoie des résultats pour les "procédures stockées drupal" qui semblent intéressants. Avez-vous essayé le code? Pouvez-vous nous dire ce qui a fonctionné et ce qui n'a pas fonctionné?
marcvangend
1
Oui, j'ai fait une recherche dans google. Il semble avoir besoin de quelques lignes de code pour exécuter une seule procédure stockée avec des paramètres. Existe-t-il une fonction d'assistance dans l'API Drupal pour exécuter la procédure stockée?
Mahesh Bhat

Réponses:

11

En supposant que vous utilisez Drupal 7, vous pouvez utiliser du code comme celui-ci:

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

Cette méthode est complètement éliminée de cet article et a bien fonctionné pour moi dans le passé.

Clive
la source
merci de l'avoir abattu! la page référencée avec "cet article" ne résout pas.
cdmo
0

Je ne sais pas si c'est la bonne façon de procéder, mais cela a fonctionné pour moi. J'ai un système hérité qui partage le même serveur de base de données Postgres que Drupal.

Dans un gestionnaire de soumission, j'avais besoin d'envoyer des données à ce système hérité qui avait une procédure stockée (Postgres les appelle des fonctions) pour gérer les données:

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

Cela a réussi à obtenir les données dans mon ancien système

Colin Shipton
la source