• 締切済み

コメントが消えてしまいます

mysqlのクライアントから、create procedure文を入力し、表示するとコメントが消えてしまいます。 (例) >delimiter // >CREATE PROCEDURE abc() >BEGIN >#comment >SELECT "A"; >END; >// >SHOW CREATE PROCEDURE abc; >// +-----------+----------+---------------------------------------------------------------------------+ | Procedure | sql_mode | Create Procedure | +-----------+----------+---------------------------------------------------------------------------+ | abc | | CREATE DEFINER=`root`@`localhost` PROCEDURE `abc`() BEGIN SELECT "A"; END | どうしたらコメントが入れられるか、どなたかお知恵をお貸しください。 mysqlのバージョンは 5.1で、OSはRedHat EL5です。 どうぞよろしくお願いいたします。m(__)m

  • MySQL
  • 回答数1
  • ありがとう数1

みんなの回答

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

>#comment このコメントは、外部ファイルからsql文を読み込んで実行する時などに、外部ファイルをみた人に解りやすいようにするためのコメントなので、データとしては保持されません。 ーーMySQLmanualから構文抜粋引用 CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body characteristic: ... | COMMENT 'string' これをみるとcharacteristicの部分にコメント文を保持できるようですけど、routine_bodyの途中には無理のよう。 動作説明を入れるのが目的なら、このCOMMENT節でも十分かとおもう。

arigataou
質問者

補足

早速のご回答ありがとうございます。 補足ですが、現在Nabicatというツールを使って入力するとコメントが入ります。入ったあとで、MySQLのクライアントでshow create procedure xxと実行すると、コメントは入っています。しかしツールを使用せずに、MySQLのクライアントで直接入力するとコメントが入らないのです。 この当たりのことをご存知ないでしょうか。 どうぞよろしくお願いいたします。

関連するQ&A

  • MySQLのストアドプロシージャについて

    MySQL5.6のストアドプロシージャが返すSELECT結果のフェッチ方法について教えてください。 delimiter $ create procedure sample_proc() begin select * from TEST_TBL; end$ の様なストアドプロシージャがあり、これを他のストアドプロシージャから呼び出して、 ループしながらフェッチしたいのですが、どうすればよいでしょうか。

  • ストアドプロシージャが作成されない

    ●質問の主旨 phpMyAdminのMySQLで ストアドプロシージャの動作確認をしています。 試しに、 delimiter // create procedure pr30() begin select * from tb; select * from tb1l; select * from tb1; end // delimiter ; というプロシージャを作成して、 実行を押しても、画面が全く変化しません。 エラーの表示さえされません。 (もちろんデータベーステーブルのtb、tb1l、tb1が 存在することは確認済みです) また、作成している最中に、 命令文が勝手に消えることもあります。 普通に select * from tb; と、書いていても消えることはないのですが…。 この現象や対策についてご存知の方がいらっしゃいましたら、 アドバイスをお願いします。 ●環境 windows8 xammp1.8.1 phpMyAdmin3.5.2.2 MySQL5.5.27

    • ベストアンサー
    • MySQL
  • phpmyadminはトリガーやIF文を使えますか

    mysql> delimiter $$ mysql> create trigger trigger_update after update on user for each row -> begin -> update address set name = new.name where name = old.name; -> end; -> $$ mysql> delimiter ; こちらをphpmyadminでどのようにしたら使うことができますか。

    • ベストアンサー
    • MySQL
  • ストアドプロシージャ作成時のエラーについて

    お世話になっております。 CREATE PROCEDURE AAA (IN param INT) BEGIN SELECT CD, NAME FROM TBL WHERE TBL_KEY = param; END INTEGER型の引数を渡してVARCHAR型のCD、NAMEを取り出す程度のストアドプロシージャを作成しようとすると 1303 - Can't create a PROCEDURE from within another stored routine. なるエラーが表示されて作成ができません。 このエラーの理由についてコメント頂ければ幸いです。

    • ベストアンサー
    • MySQL
  • ストアドプロシージャについて

    アドバイスを頂けたらと思います。 php   5.1.6 mysql   5.0.22 接続方法 PDO PHPよりストアドプロシージャを実行するとEXCUTEの部分で応答がなくなりMYSQLの SHOW PROCESSLIST を確認するとそのプロセスがSleep になってしまっています。 記述方法が間違っているか、またはどこか設定するのか、参考意見を 頂ければと思います。 PHP側 <?php try { $user = 'sys'; $pass = 'sys'; $dbh = new PDO('mysql:host=localhost;dbname=testDB', $user, $pass); if ($st = $dbh->prepare("CALL Listget()") ){ $st->execute(); while ($row = $st->fetch()) { print_r ($row); } } } catch (PDOException $e) { print 'Error: ' . $e->getMessage(). "\n"; } $dbh = null; ?> ストアド delimiter // CREATE PROCEDURE Listget ( ) BEGIN SELECT id FROM testTbl; END // よろしくお願いします。

    • ベストアンサー
    • PHP
  • Mysql 何故エラーになるのですか?

    mysql> create user 'root'@'localhost' identified by 'rhythmkt0'; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements mysql> create user 'wordpress'@'localhost' identified by 'rhythm0!KT'; ERROR 1396 (HY000): Operation CREATE USER failed for 'wordpress'@'localhost' mysql> SELECT User, Host FROM mysql.user; +------------------+-----------+ | User | Host | +------------------+-----------+ | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | | wordpress | localhost | +------------------+-----------+ 5 rows in set (0.00 sec) 上記の様にエラーになります。 どこが誤っているのでしょうか? ご回答のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • phpMyAdminからストアドプロシージャを

    phpMyAdminからストアドプロシージャを作成したいのですが、エラーが表示され作成できません。 DELIMITER // CREATE PROCEDURE proc1(INT pa char(10)) BEGIN update sum_table set blank = pa; END; // DELIMITER ; これを実行したところ以下のエラーが出ました。 #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 'INT pa char(10)) BEGIN update sum_table set blank = pa; END' at line 1 -------------------------------------------------------------------------------- そこでソースから「DELIMITER」を消してもう一度実行してみました。 CREATE PROCEDURE proc1(INT pa char(10)) BEGIN update sum_table set blank = pa; END; すると今度は以下のエラーが表示されました。 #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 'INT pa char(10)) BEGIN update sum_table set blank = pa' at line 1 どこが間違っているかわからず困っております。 初歩的な質問で凝縮ですが、どなたかご教示いただけますでしょうか?

  • ストアドファンクション⇒プロシージャ呼出し失敗する

    参考の通りに、ストアドプロシージャ作成SQL文を発行し、 コマンドライン上からは、以下の通りの結果1となり、 レコードがinsertされます。 <結果1> mysql> call logger('ほげ', 'ホゲ'); Query OK, 1 row affected (0.01 sec) mysql> select * from PROCEDURE_LOG; +--------+--------+---------------------+ | NAME | QUERY | EXECUTE_DATE | +--------+--------+---------------------+ | ほげ | ホゲ | 2014-03-26 10:41:26 | +--------+--------+---------------------+ 1 row in set (0.00 sec) ですが、testというストアドファンクションから呼び出してみましたが、 以下の結果2の通り、失敗します。 <結果2> mysql> select test(); ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger <test> BEGIN CALL logger('test','1'); RETURN CONCAT('END'); END 現在動作している環境では、どこでエラーが発生したかがわからず、 ロガーの処理をなんとしても実装したいのですが、 いろいろ試してみても、解決できませんでした。 ご教示のほど、よろしくお願いします。 <参考> http://treeapps.hatenablog.com/entry/20120106/p1 <ストアドプロシージャ作成SQL文(logger)> SET NAMES UTF8; delimiter // -- ログ出力 DROP PROCEDURE IF EXISTS logger// CREATE PROCEDURE logger( IN PROCEDURE_NAME TEXT, IN SQL_TEXT TEXT ) BEGIN DECLARE CNT INT; CREATE TABLE IF NOT EXISTS PROCEDURE_LOG ( NAME VARCHAR(64), QUERY TEXT, EXECUTE_DATE TIMESTAMP, KEY IDX1 (NAME, QUERY(64), EXECUTE_DATE) ) ENGINE=MYISAM DEFAULT CHARSET=UTF8; -- 古いログを削除 SELECT COUNT(*) INTO CNT FROM PROCEDURE_LOG; IF CNT >= 1000 THEN DELETE FROM PROCEDURE_LOG LIMIT 1; END IF; -- テーブルにログを記録 SET @sql = CONCAT('INSERT INTO PROCEDURE_LOG VALUES (', QUOTE(PROCEDURE_NAME), ',', QUOTE(SQL_TEXT), ', null)'); PREPARE stmt FROM @sql; EXECUTE stmt; END // delimiter ;

    • ベストアンサー
    • MySQL
  • PL/SQL-プロシージャ

    プロシージャBはテスト実行のため、プロシージャAを真似て作成しています。 --最後のIF文で、プロシージャAかBのどちらかに走らせたいと思っています。 DECLARE --プロシージャA--------------------------------------- PROCEDURE A IS fno1 utl_file.file_type; dnm1 varchar(200) :='XXX'; fnm1 varchar2(200) :='BBB.txt'; CURSOR cu1 is select XYZ as ABC from CCC; BEGIN fno1 := utl_file.fopen(dnm1,fnm1,'w'); FOR CU1_REC1 in CU1 loop utl_file_put_line(fno1,' '|| CU1_REC1.XYZ END LOOP; utl_file.fclose(fno1); end; --プロシージャB------------------------------------- プロシージャAと似たような処理 --プロシージャAかBかを判定するIF文------------------------------ BEGIN IF CCC.ABC = '0'; THEN A; ELSE B; ENDIF; END; /

  • 2分木を中順でなぞりたいのですが(pascal)

    課題で「2分探索木にデータを挿入する手続きを定義し、作った木を中順になぞって出力せよ」というのが出されました。       6      /  \     4    7     /     \    2      9     \   /  \     3   8   10            \            11               \              12 このような木を考えプログラムを組み実行できたのですが、結果が「2,3,4,6,7,8,9,10,11,12」となってしまいます。中順だと「3,2,4,6,8,9,12,11,10,7」のはずなので合いません。 どこがおかしいのかご指摘お願いします。 ソースは以下の通りです。 program tree_search (input,output); type elementtype = integer; pointertype = ^celltype; celltype = record element : elementtype; leftson : pointertype; rightson: pointertype end; var root : pointertype; procedure inorder( node:pointertype); begin if (node <> nil) then begin inorder( node^.leftson); write( node^.element); inorder( node^.rightson) end end; {中順になぞる} procedure insert( x:integer; var p:pointertype); begin if ( p = nil) then begin new( p ); p^.element := x; p^.leftson := nil; p^.rightson := nil end else if ( x < p^.element ) then insert( x,p^.leftson) else if ( x > p^.element ) then insert( x,p^.rightson) end; {木に挿入する} procedure create( var p:pointertype ); begin p:= nil end; {空の木を作る} begin create(root); insert( 6,root ); insert( 4,root ); insert( 2,root ); insert( 3,root ); insert( 7,root ); insert( 9,root ); insert( 8,root ); insert( 10,root ); insert( 11,root ); insert( 12,root ); inorder( root ) end.