drupalでストアドプロシージャを実行する方法


9

私は財務データに多くの作業を行うウェブサイトを持っています。ほとんどの場合、これには大量のデータの操作が含まれます。したがって、これらの操作をmysqlのストアドプロシージャで実行すると便利です。データベースにストアドプロシージャを持っています。drupalでストアドプロシージャを実行するにはどうすればよいですか?drupalでストアドプロシージャを実行する良い方法はありますか?drupalは一般的にストアドプロシージャをどのように処理しますか?または、PHPを使用してストアドプロシージャを実行する必要がありますか?


ウェブを検索しましたか?Googleは、興味深いと思われる「Drupalストアドプロシージャ」の結果を返します。コードを試しましたか?何が機能し、何が機能しなかったかを教えてください。
marcvangend

1
はい、Googleで検索しました。パラメータを使用して単一のストアドプロシージャを実行するには、数行のコードが必要なようです。ストアドプロシージャを実行するためのDrupal APIのヘルパー関数はありますか?
Mahesh Bhat、2012年

回答:


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 2017

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

これにより、データがレガシーシステムに正常に取り込まれました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.