Mysqlコンソールでは、delimiterコマンドを使用して区切り文字を変更します。手順を定義すると便利です。 mysqlクライアント(クライアント側コマンド)のコマンドdelimiter
を理解しました。
しかし、私はdelimiter
のようなコマンドdbslayer
のないmysqlクライアントを使用しています。この種のクライアントでは、どのように手順を定義できますか。
とりあえず検討してください:
create procedure test_pro()
begin
select 'hello pro';
end
私は以下を試しました:
mysql -u root -pmypass test < proc_file
proc_fileには上記の手順が含まれます。
しかし、それは私に次のエラーを与えています:
ERROR 1064 (42000) at line 1: 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 '' at line 3
イベント以下を試しました
create procedure test_pro()
begin
select 'hello pro';
end;
(末尾のセミコロンが追加されました)しかし、同じエラーが発生しています。
同じことがdbslayer
で発生しています。ターミナルから上記の手順を定義できれば、dbslayer
でそれを実行できるはずです。
それを回避する方法はありません。 DELIMITER
コマンドを使用する必要があります。どうして ?
ストアドプロシージャのmysqldumpを実行した場合、各ストアドプロシージャは
DELIMITER ;;
そしてで終わる
DELIMITER ;
これは私が前にこれについて述べた投稿です: 存在する場合は削除手順がmysqldumpに含まれていません
Mysqldumpを使用して1つのストアドプロシージャをダンプしてみてください。
これを行うためのコードも書きました。
(答え@ altmannmarcelo によって投稿された場合、それは直接あなたの質問に答えます(+1 for彼の答え)。そうしないと、mysqldumpsはストアドプロシージャを復元できません。
新しいDELIMITERに対応するには、次の2つの方法があります。
コマンドライン自体に区切り文字を与える
mysql -u root -pmypass --delimiter="//" test < myproc.sql
これは、mysqlクライアントプログラムのコマンドラインオプションです。
[root@****]# mysql --help | grep -i delimiter
--delimiter=name Delimiter to be used.
delimiter ;
コードをテキストファイルに書き込んで、テキストファイルに対して @ altmannmarcelo のように実行できます
echo "DELIMITER //" > myproc.sql
echo "create procedure test_pro()" >> myproc.sql
echo "begin" >> myproc.sql
echo "select 'hello pro';" >> myproc.sql
echo "end" >> myproc.sql
echo "//" >> myproc.sql
mysql -u root -pmypass test < myproc.sql
プロシージャを作成するには区切り文字を変更する必要があります。変更しない場合、MySQLはselect 'hello pro';
でクエリをコミットしようとします
手順を次のように変更します。
DELIMITER //
create procedure test_pro()
begin
select 'hello pro';
end
//
MySQLドキュメント から:
Mysqlクライアントプログラムを使用して、セミコロン文字を含むストアドプログラムを定義すると、問題が発生します。デフォルトでは、mysql自体がセミコロンをステートメント区切り文字として認識します。そのため、区切り文字を一時的に再定義して、mysqlがストアドプログラム定義全体をサーバーに渡すようにする必要があります。
これは私のために働きました:
Mysqlfile.sqlの内容
USE `dbschemaname`;
DROP procedure IF EXISTS `myprocname`;
DELIMITER $$
USE `dbschemaname`$$
CREATE DEFINER=`myusername`@`%` PROCEDURE `myprocname`(IN myvar VARCHAR(3500))
BEGIN
DECLARE my_id INT;
SELECT id INTO veh_id FROM mytable WHERE something = myvar;
END$$
DELIMITER ;
そしてコマンドラインで:
$ mysql -u user -pmypass dbschemaname < mysqlfile.sql
私はこれが古い質問であることを知っていますが、以下は将来誰かのために役立つかもしれません:
#!/bin/bash
echo "Started ..."
date
Host=localhost
user=dbusername
password=dbpassword
database=databasename
time /usr/bin/mysql --Host=$Host --user=$user --password=$password --database=$database<<EOFMYSQL
DELIMITER $$
create procedure test_pro()
BEGIN
SELECT 'hello pro';
END$$
DELIMITER ;
SHOW WARNINGS;
SHOW COUNT(*) WARNINGS;
EOFMYSQL
echo "Finished "
date
Maria DBに対してテストされ、機能します。
完了したら、次のコマンドを使用してプロシージャを呼び出すことができます。
call test_pro();
それが役に立てば幸い:)