ここから本文です

MySqlのfunctionを使用して SQLで取得したレコードを(呼び元に)リターンする方法...

fas********さん

2011/7/613:01:37

MySqlのfunctionを使用して
SQLで取得したレコードを(呼び元に)リターンする方法について教えて下さい。

教えていただきたいのは、MySqlのfunctionを使用して
SQLにより取得した複数レコード(複数行)を呼元にリターンする方法です。
(仕様として、必ず値をリターンする必要があるため
procedureではなくfunctionを使う必要があります。)

ネットで調べましたが、function内でVARCHAR以外でクエリをリターンする
方法が見つかりませんでした。

fuction内で配列は使用出来ないのでしょうか??
下記のクエリを実行した所、一行しか返却されていません。

+--------------------------+
| get_color() |
+--------------------------+
| 4,#000000,黒 |
+--------------------------+

functionの呼び元はJAVAを想定しています。
JAVA側でリターンされたレコードのセットを一行づつ
取得し処理することを想定しています。



※以下はテーブルからカラーコードとカラー名を取得するファンクションです。
----------------------------------------------------------------------------------
delimiter //
CREATE FUNCTION get_color() RETURNS VARCHAR(500) DETERMINISTIC

BEGIN
-- ----------------------------------------------------
-- 変数宣言
-- ----------------------------------------------------
DECLARE done int;
DECLARE WK_RECTYPE VARCHAR(500);
DECLARE RESULT VARCHAR(500);

-- ---------------------------------
-- カーソルの設定
-- ---------------------------------
DECLARE C_REC CURSOR FOR
SELECT
CONCAT(COLOR.COLOR_ID,',',
COLOR.COLOR_NAME,',',

) as RESULT_AREA
FROM
COLOR_TABLE COLOR;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

-- ---------------------------------
-- カーソルのオープン
-- ---------------------------------
OPEN C_REC;

REPEAT
FETCH C_REC INTO WK_RECTYPE;
UNTIL done
end REPEAT;
-- ---------------------------------
-- カーソルのクローズ
-- ---------------------------------
CLOSE C_REC;

RETURN WK_RECTYPE;
END;
//

補足元々Postgresqlに組み込んでいたファンクションを
MySqlに移植しようとしています。

PostgresqlではRecord型が使えていたため、
問題なくクエリのセットをリターン出来ていたのですが、
同じことをMySqlで行おうとした所、方法が見つからず詰まってしまいました。
(varchar,int型などは返却できることを確認済みです。)

ご教示の程、よろしくお願いします。

閲覧数:
4,557
回答数:
1
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

nora1962jpさん

2011/7/616:27:50

MySQLのファンクションはレコード型返せませんが、ストアドプロシージャはレコードセットを返せます。
ストアドプロシージャ内でTemporary Tableを作成し、必要なデータをINSERTして最後に
SELECT * FROM 一時テーブル名
を実行すれば呼び出し元にレコードセットが変えるはずです。

質問した人からのコメント

2011/7/7 12:20:23

降参 素早い回答ありがとうございました。

nora1962jpさんの言われた通りストアドプロシージャに変えることで
無事戻り値を取得することが出来ました。

ただし、取得元となるJAVA側のResultSetが元のままでは使えませんでした。
そのためMySql仕様にResultSet周りを書き換えることで、データ取得が
出来るようになりました。

本当、ありがとうございました!!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる