如何在Drupal中执行存储过程?


9

我有一个网站,它在财务数据方面做很多工作。大多数情况下,它涉及对大量数据的操作。因此,我发现在mysql存储过程中执行这些操作很有用。我在数据库中存储了过程。我想知道如何在drupal中执行存储过程?有没有什么好的方法可以在drupal中执行存储过程?drupal一般如何处理存储过程?还是我们只需要使用PHP执行存储过程?


您搜索过网络吗?Google返回了一些“有趣的存储过程”的结果。您是否尝试过代码?您能告诉我们什么起作用了,什么没起作用?
marcvangend 2012年

1
是的,我确实在Google中搜索。似乎需要几行代码来执行带有参数的单个存储过程。Drupal API中是否有任何辅助函数来执行存储过程?
Mahesh Bhat 2012年

Answers:


11

假设您正在使用Drupal 7,则可以使用如下代码:

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

该方法已从本文中完全剔除,并且在过去对我有效。


感谢您剔除它!用“本文”引用的页面无法解析。
cdmo

0

不确定这是否是正确的方法,但是对我有用。我有一个旧系统,它共享与Drupal相同的Postgres数据库服务器。

在提交处理程序中,我需要将数据发送到具有存储过程(Postgres称为函数)的旧系统来处理数据:

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

这成功地将数据导入了我的旧系统

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.