¿Cómo ejecutar procedimientos almacenados en drupal?

9

Tengo un sitio web que trabaja mucho en datos financieros. Implica operaciones en grandes volúmenes de datos la mayor parte del tiempo. Por lo tanto, me resulta útil hacer esas operaciones en procedimientos almacenados de mysql. He almacenado procedimientos en mi base de datos. Quiero saber cómo puedo ejecutar procedimientos almacenados en drupal? ¿Hay algún buen método para ejecutar procedimientos almacenados en drupal? ¿Cómo maneja Drupal los procedimientos almacenados en general? ¿O simplemente tenemos que usar PHP para ejecutar procedimientos almacenados?

Mahesh Bhat
fuente
¿Has buscado en la web? Google devuelve algunos resultados para "procedimientos almacenados de drupal" que parecen interesantes. ¿Probaste el código? ¿Puede decirnos qué funcionó y qué no?
marcvangend
1
Sí, busqué en google. Parece que se necesitan pocas líneas de código para ejecutar un único procedimiento almacenado con parámetros. ¿Hay alguna función auxiliar en la API de Drupal para ejecutar el procedimiento almacenado?
Mahesh Bhat

Respuestas:

11

Suponiendo que está usando Drupal 7, puede usar un código como el siguiente:

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

Ese método está completamente eliminado de este artículo y me ha funcionado bien en el pasado.

Clive
fuente
gracias por sacrificarlo! la página a la que se hace referencia con "este artículo" no se resuelve.
cdmo
0

No estoy seguro de si esta es la forma correcta de hacerlo, pero funcionó para mí. Tengo un sistema heredado que comparte el mismo servidor de base de datos Postgres que Drupal.

En un controlador de envío, necesitaba enviar datos a este sistema heredado que tenía un procedimiento almacenado (Postgres los llama funciones) para manejar los datos:

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

Esto consiguió los datos con éxito en mi sistema heredado

Colin Shipton
fuente