- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ストアドファンクション⇒プロシージャ呼出し失敗する)
ストアドファンクション⇒プロシージャ呼出し失敗
このQ&Aのポイント
- 参考の通りに、ストアドプロシージャ作成SQL文を発行し、コマンドライン上からは、以下の通りの結果1となり、レコードがinsertされます。
- ですが、testというストアドファンクションから呼び出してみましたが、以下の結果2の通り、失敗します。
- 現在動作している環境では、どこでエラーが発生したかがわからず、ロガーの処理をなんとしても実装したいのですが、いろいろ試してみても、解決できませんでした。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
stored function からは procedure 経由でも prepared 文は発行できないようです。function自体がprepared に近い機構で動作してて多重prepareは出来ないんだとかいう理由だったような?細かい理由は英文マニュアル参照。 とりあえず、日本語マニュアルには、一文ですまされてますが。 http://dev.mysql.com/doc/refman/5.1-olh/ja/sql-syntax-prepared-statements.html 後半に以下の一文 「準備済みステートメントの SQL 構文はストアドプロシージャー内で利用できますが、ストアドファンクションやトリガー内では利用できません。」 procedure 側へ、データ取りだしSQL文も渡して、procedure内で完結させるしかないのでは? procedure の連鎖は可能なんだし。 それとも、以下の記事のように、 Gearman MySQL UDF をインストールしたうえでさらに、別アプリケーションから実行とか? http://d.hatena.ne.jp/heavenshell/20100610/1276161261 上記は、自前MySQLサーバーでないと無理かと思うけど、どういう状況における何のログなのかによっても、取り得る方法は変わってくるでしょう。
お礼
ご回答ありがとうございます。 既存環境の障害で異常終了をすることが判明し、 原因を探るため、ストアドファンクション内でのログ出力を考えていました。 異常終了の問題となった箇所は、phpからsql文を発行し、 ストアドファンクションを呼び出している処理でした。 ご教示の通り、多重prepared はできないため、この方法は諦めました。 問題については、 ある条件の場合のみ落ちることが解っていたため、 コードの解析により解決しました。 原因は未初期化変数の参照によるものでした。 >http://d.hatena.ne.jp/heavenshell/20100610/1276161261 自前の環境でないので、 どうしようもない状況の最後の切り札として提案しようと思います。