0

次のテーブル構造があります

id     |      Name     | senior id

1      |   superadmin  |  -1
2      |   abc         |   1     
3      |   xyz         |   1
4      |   pqr         |   2   
5      |   vwx         |   3
6      |   stu         |   3
7      |   efg         |   4
8      |   ijk         |   3
9      |   nop         |   3
10     |   rst         |   3
11     |   uvw         |   9

ここでは、入力として id を受け取り、id に関連付けられた名前から、seniorid が -1 である名前まで、「/」で区切られた連結された名前の文字列を返すストアド プロシージャを作成しました。

たとえば、ID を 10 として SP に渡すと、返される文字列は次のようになります。 rst/xyz/superadmin/

ここに私が書いたストアドプロシージャがあります

DELIMITER $$;

DROP PROCEDURE IF EXISTS `mydb`.`get_list_up_to_senior`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_list_up_to_senior`(id int (8))

BEGIN
DECLARE strsenior VARCHAR(250);
DECLARE strseniorlist VARCHAR(250);
DECLARE temp int(8);
SET strsenior =  '';
SET strseniorlist = '';
SET temp = id;
WHILE temp  != -1 DO
   SET  strsenior = (SELECT name FROM mydb.tblname WHERE id = temp limit 1);
   SET  temp = (SELECT seniorid FROM mydb.tblname WHERE id = temp limit 1);
   SET  strseniorlist = CONCAT(strseniorlist,strsenior,'/');
END WHILE;

SELECT strseniorlist;
END$$

DELIMITER ;$$

この SP をコンパイルすると、エラーなしでコンパイルされます。しかし、このSPを実行すると; その取得は完全に実行され、返されます

strseniorlist
superadmin/

1) SP のどこが間違っているので、目的の出力が得られませんか。

私のデータベースのバージョンは MySQL 6.0 で、Sqlyog を使用して SP 上で実行しています。

2)MySql 5.0で上記のSPを実行すると、作成されず、次のエラーが発生します

ERROR :

(0 row(s) affected)
(0 ms taken)

Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PROCEDURE `get_list_up_to_senior`(id int (8))

BEGIN
DECLARE strsenior VA' at line 1
(16 ms taken)

問題を解決するために、これで友達を案内してください ありがとう!

4

1 に答える 1

0

原因を見つけて、最初の質問に答えました。期待される出力が得られない理由は、SPへの着信パラメーターとしてユーザー定義変数名「id」を使用しているためです。この変数名'id'は、前述のテーブルの列名に似ています。したがって、MySqlはこの「id」をテーブル列ではなくローカル変数と見なしています。対立はここにあります。着信パラメータ変数名をSPに変更した場合、クエリで言及されたテーブルの列名と競合しない別の名前に変更します。目的の出力が得られます。

ありがとう!

于 2012-10-15T13:30:47.377 に答える