Como executar procedimentos armazenados no drupal?

9

Eu tenho um site que faz muito trabalho em dados financeiros. Envolve operações em grandes volumes de dados na maioria das vezes. Por isso, acho útil fazer essas operações nos procedimentos armazenados do mysql. Eu tenho procedimentos armazenados no meu banco de dados. Quero saber como executar procedimentos armazenados no drupal? Existe algum bom método para executar procedimentos armazenados no drupal? Como o drupal lida com os procedimentos armazenados em geral? Ou apenas temos que usar o PHP para executar procedimentos armazenados?

Mahesh Bhat
fonte
Você pesquisou na web? O Google retorna alguns resultados para "procedimentos armazenados drupal" que parecem interessantes. Você tentou o código? Você pode nos dizer o que deu certo e o que não deu?
Marcvangend 30/05
11
Sim, eu pesquisei no google. Parece haver poucas linhas de código para executar um único procedimento armazenado com parâmetros. Existe alguma função auxiliar na API Drupal para executar o procedimento armazenado?
Mahesh Bhat

Respostas:

11

Supondo que você esteja usando o Drupal 7, você pode usar código como o seguinte:

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

Esse método é completamente selecionado deste artigo e funcionou bem para mim no passado.

Clive
fonte
obrigado por abatê-lo! a página referenciada com "este artigo" não resolve.
Cdmo #
0

Não tenho certeza se esse é o caminho correto para isso, mas funcionou para mim. Eu tenho um sistema legado que compartilha o mesmo servidor de banco de dados Postgres que o Drupal.

Em um manipulador de envio, eu precisava enviar dados para este sistema legado que tinha um procedimento armazenado (o Postgres os chama de funções) para manipular os dados:

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

Isso colocou os dados com sucesso no meu sistema legado

Colin Shipton
fonte