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


9

mysqlコンソールでは、delimiterコマンドを使用して区切り文字を変更します。手順を定義すると便利です。delimitermysqlクライアントのみのコマンド(クライアント側コマンド)を理解しました 。

しかし、私はのdelimiter ようなコマンドを持たないmysqlクライアントdbslayerを使用しています。この種のクライアントでは、どのようにプロシージャを定義できますか。

今のところ検討:

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

回答:


10

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

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

DELIMITER ;;

そしてで終わる

DELIMITER ;

これは私が前にこれについて述べた投稿です:mysqldumpに含まれていない場合のDROP PROCEDURE IF

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

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

@altmannmarceloによって投稿された回答については、質問に直接回答します(回答の+1)。そうしないと、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

試してみる !!!


3

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

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

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

MySQLのドキュメントから:

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


mysqlコンソールでこの区切り文字を知っています。別のものを探しています。mysqlコンソールにログインせずにプロシージャを作成する方法を尋ねました。mysql -u root -ppass db -e "select somecolumn from testtable"のように実行すると、Linux端末で上記のコマンドを実行すると、-eの後に指定されたクエリの結果が得られます。クエリを実行すると切断されますが、そのクエリではデリミタ//が機能しません。
neotam 2013年

@RolandoMySQLDBAが(+1)と言っているように、プロシージャをファイルに保存するか、コマンドラインでDELIMITER引数を渡して変更することができます。--delimitermysql
アルトマンマルセロ2013年

2

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

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

0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.