web-dev-qa-db-ja.com

Linuxターミナルを介してMySQLストアドプロシージャを作成する方法

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でそれを実行できるはずです。

9
neotam

それを回避する方法はありません。 DELIMITERコマンドを使用する必要があります。どうして ?

ストアドプロシージャのmysqldumpを実行した場合、各ストアドプロシージャは

DELIMITER ;;

そしてで終わる

DELIMITER ;

これは私が前にこれについて述べた投稿です: 存在する場合は削除手順がmysqldumpに含まれていません

Mysqldumpを使用して1つのストアドプロシージャをダンプしてみてください。

これを行うためのコードも書きました。

(答え@ altmannmarcelo によって投稿された場​​合、それは直接あなたの質問に答えます(+1 for彼の答え)。そうしないと、mysqldumpsはストアドプロシージャを復元できません。

新しいDELIMITERに対応するには、次の2つの方法があります。

これを試す#1

コマンドライン自体に区切り文字を与える

mysql -u root -pmypass --delimiter="//" test < myproc.sql

これは、mysqlクライアントプログラムのコマンドラインオプションです。

[root@****]# mysql --help | grep -i delimiter
  --delimiter=name    Delimiter to be used.
delimiter                         ;

これを試す#2

コードをテキストファイルに書き込んで、テキストファイルに対して @ 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

試してみる !!!

10
RolandoMySQLDBA

プロシージャを作成するには区切り文字を変更する必要があります。変更しない場合、MySQLはselect 'hello pro';でクエリをコミットしようとします

手順を次のように変更します。

DELIMITER //
create procedure test_pro()
begin
select 'hello pro';
end
//

MySQLドキュメント から:

Mysqlクライアントプログラムを使用して、セミコロン文字を含むストアドプログラムを定義すると、問題が発生します。デフォルトでは、mysql自体がセミコロンをステートメント区切り文字として認識します。そのため、区切り文字を一時的に再定義して、mysqlがストアドプログラム定義全体をサーバーに渡すようにする必要があります。

3
altmannmarcelo

これは私のために働きました:

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
2
user38380

私はこれが古い質問であることを知っていますが、以下は将来誰かのために役立つかもしれません:

#!/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();

それが役に立てば幸い:)

0
justMe