Як виконати збережені процедури в drupal?


9

У мене є веб-сайт, який дуже багато працює над фінансовими даними. Він передбачає операції над великими обсягами даних більшу частину часу. Тому мені здається корисним виконувати ці операції в процедурах, що зберігаються в mysql. Я зберігаю процедури у своїй базі даних. Я хочу знати, як я можу виконувати збережені процедури в друпалі? Чи є якийсь хороший метод виконання збережених процедур в drupal? Як drupal обробляє збережені процедури взагалі? Або нам просто потрібно використовувати PHP для виконання збережених процедур?


Ви шукали в Інтернеті? Google повертає деякі результати для "друпальних збережених процедур", які здаються цікавими. Ви спробували код? Чи можете ви сказати нам, що працювало, а що ні?
marcvangend

1
Так, я шукав у Google. Здається, потрібно кілька рядків коду для виконання єдиної збереженої процедури з параметрами. Чи є якась допоміжна функція в API Drupal для виконання збереженої процедури?
Махеш Бхат

Відповіді:


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

Не впевнений, чи це правильний шлях до цього, але це працювало для мене. У мене є застаріла система, яка ділиться тим же сервером баз даних Postgres, що і Drupal.

У обробнику подання мені потрібно було надіслати дані до цієї застарілої системи, яка мала збережену процедуру (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,
    ...
  ]);

Ці дані вдало потрапили до моєї застарілої системи

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.