web-dev-qa-db-ja.com

MySQLは区切り文字を使用してストアドプロシージャの構文を作成します

次のような区切り文字を使用して、MySQLでストアドプロシージャを作成しようとしています。

use am;

DELIMITER $$

CREATE PROCEDURE addfields()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE acc INT(16);
  DECLARE validId INT DEFAULT 0;

END $$

DELIMITER ;

それは私にエラーを与えます:

#1304 - PROCEDURE addfields already exists

区切り文字を使用してストアドプロシージャを作成し、最初に存在する場合は削除するための適切な構文は何ですか?

36
eugen-fried

以下にサンプルを示しますMYSQLストアドプロシージャ区切り文字と呼び出し方法.

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_user_login` $$
CREATE DEFINER=`root`@`%` PROCEDURE `sp_user_login`(
  IN loc_username VARCHAR(255),
  IN loc_password VARCHAR(255)
)
BEGIN

  SELECT user_id,
         user_name,
         user_emailid,
         user_profileimage,
         last_update
    FROM tbl_user
   WHERE user_name = loc_username
     AND password = loc_password
     AND status = 1;

END $$

DELIMITER ;

呼び出し、mysql_connection仕様および

$loginCheck="call sp_user_login('".$username."','".$password."');";

プロシージャから結果を返します。

53
MKV

MySQLでのストアドプロシージャの構文の使用開始:

優れたプログラマーはターミナルを使用します。GUIにより、途中でソフトになります。慣れてコマンドを覚えると、どのGUIよりも5倍速くなります。生産性=成功。

1。ターミナルを開き、次のようにmysqlにログインします:

el@apollo:~$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
mysql> 

2。手順があるかどうかを確認してください:

mysql> show procedure status;
+-----------+---------------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db        | Name          | Type      | Definer | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-----------+---------------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
|   yourdb  | sp_user_login | PROCEDURE | root@%  | 2013-12-06 14:10:25 | 2013-12-06 14:10:25 | DEFINER       |         | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+-----------+---------------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)

定義済みのものがありますが、おそらく最初は何もありません。

3。データベースに変更して削除します。

mysql> use yourdb;
Database changed

mysql> drop procedure if exists sp_user_login;
Query OK, 0 rows affected (0.01 sec)

mysql> show procedure status;
Empty set (0.00 sec)

4。 Okので、ストアドプロシージャは定義されていません。最も簡単なものを作成してください:

mysql> delimiter //
mysql> create procedure foobar()
    -> begin select 'hello'; end//
Query OK, 0 rows affected (0.00 sec)

//は、ストアドプロシージャのコマンドの入力が完了すると、端末と通信します。ストアドプロシージャ名はfoobarです。パラメータを受け取らず、「h​​ello」を返す必要があります。

5。そこにあるかどうかを確認し、区切り文字を忘れずに設定してください!:

 mysql> show procedure status;
 -> 
 -> 

ガッチャ!なぜこれが機能しなかったのですか?区切り文字を//に設定したことを覚えていますか? ;に戻す

6。区切り文字を元に戻し、手順を確認します:

mysql> delimiter ;
mysql> show procedure status;
+-----------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db        | Name   | Type      | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-----------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| yourdb    | foobar | PROCEDURE | root@localhost | 2013-12-06 14:27:23 | 2013-12-06 14:27:23 | DEFINER       |         | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+-----------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)

7。それを実行します:

mysql> call foobar();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

Hello world complete、それをもっと良いもので上書きしましょう。

8。 foob​​arを削除し、再定義してパラメーターを受け入れ、再実行します:

mysql> drop procedure foobar;
Query OK, 0 rows affected (0.00 sec)

mysql> show procedure status;
Empty set (0.00 sec)

mysql> delimiter //
mysql> create procedure foobar (in var1 int)
    -> begin select var1 + 2 as result;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call foobar(5);
+--------+
| result |
+--------+
|      7 |
+--------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

いいね!入力を受け取り、それを変更し、出力するプロシージャを作成しました。ここで、out変数を実行します。

9。 foob​​arを削除し、out変数を作成して実行します:

mysql> delimiter ;
mysql> drop procedure foobar;
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter //
mysql> create procedure foobar(out var1 varchar(100))
    -> begin set var1="kowalski, what's the status of the nuclear reactor?";
    -> end//
Query OK, 0 rows affected (0.00 sec)


mysql> delimiter ;
mysql> call foobar(@kowalski_status);
Query OK, 0 rows affected (0.00 sec)

mysql> select @kowalski_status;
+-----------------------------------------------------+
| @kowalski_status                                    |
+-----------------------------------------------------+
| kowalski, what's the status of the nuclear reactor? |
+-----------------------------------------------------+
1 row in set (0.00 sec)

10。 MySQLでのINOUTの使用例:

mysql> select 'ricksays' into @msg;
Query OK, 1 row affected (0.00 sec)


mysql> delimiter //
mysql> create procedure foobar (inout msg varchar(100))
-> begin
-> set msg = concat(@msg, " never gonna let you down");
-> end//


mysql> delimiter ;


mysql> call foobar(@msg);
Query OK, 0 rows affected (0.00 sec)


mysql> select @msg;
+-----------------------------------+
| @msg                              |
+-----------------------------------+
| ricksays never gonna let you down |
+-----------------------------------+
1 row in set (0.00 sec)

うまくいきました。文字列を結合しました。したがって、変数msgを定義し、その変数をfoobarというストアドプロシージャに渡し、@ msgはfoobarによって書き込まれました。

これで、区切り文字を使用してストアドプロシージャを作成する方法がわかりました。ここでこのチュートリアルを続け、ストアドプロシージャ内の変数から始めます。 http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/

67
Eric Leschinski

以下は、MySQLでプロシージャを作成するためのコードです。

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `procedureName`(IN comId int)
BEGIN
select * from tableName 
         (add joins OR sub query as per your requirement)
         Where (where condition here)
END $$
DELIMITER ;

このプロシージャを呼び出すには、次のクエリを使用します。

call procedureName(); // without parameter
call procedureName(id,pid); // with parameter

詳細:

1)DEFINER:rootはユーザー名であり、mysqlのユーザー名に応じて変更します。localhostは、ホストサーバーでこのクエリを実行する場合にサーバーのIPアドレスで変更できるホストです。

詳細はこちら 詳細

2
Sunny S.M

マイSQLストアドプロシージャの作成

DELIMiTER $$
create procedure GetUserRolesEnabled(in UserId int)
Begin

select * from users
where id=UserId ;
END $$
DELIMITER ;
0
Hari Lakkakula

以下に示すように、簡単なMySQLプロシージャを作成しました。

DELIMITER //
CREATE PROCEDURE GetAllListings()
 BEGIN
 SELECT nid, type, title  FROM node where type = 'lms_listing' order by nid desc;
END //
DELIMITER;

親切にこれに従ってください。プロシージャを作成した後、同じものを確認して実行できます。

0
Md Jamiruddin