使用MySQL的存储过程的初学者指南?

bcm*_*cfc 19 mysql stored-procedures

我用谷歌搜索了,但没有提出任何我可以解决的问题.

使用存储过程的性能提升是否显着?

我是否仍然希望将预准备语句与存储过程一起使用,或者它通常是一个还是另一个?

我可以通过PHPMyAdmin创建存储过程并从那里管理它们吗?

对于像这样简单的事情,存储过程会是什么样子 -

SELECT * FROM table a 
INNER JOIN otherTable b 
ON a.join_id=b.join_id 
WHERE someVar = :boundParam
Run Code Online (Sandbox Code Playgroud)

以及PHP如何工作(PDO)来调用它并绑定其参数?

bco*_*sca 17

考虑这是对MySQL中存储过程的温和介绍:http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx

您确定可以在phpMyAdmin中创建/管理存储过程.


小智 0

一个程序

\n
    \n
  • 可以有零个或多个带有BEGIN ... END 语句的SQL 语句。*没有语句的语句BEGIN ... END不会出错。

    \n
  • \n
  • 只能有单个语句,而没有BEGIN ... END语句不将分隔符更改为$$没有错误。

    \n
  • \n
  • 可以有多个参数IN,带 、OUTINOUT不带它们。

    \n
  • \n
  • 可以从调用者处获取零个或多个带有零个或多个参数IN的值。INOUT

    \n
  • \n
  • OUT可以使用和参数向调用者返回零个或多个值INOUT

    \n
  • \n
  • 可以有局部变量用户定义变量。*我的回答解释了局部变量和用户定义的变量。

    \n
  • \n
  • 可以进行交易

    \n
  • \n
  • 不能有RETURN 语句,否则会出现错误

    \n
  • \n
  • 默认情况下不是原子的,因此如果出现错误,不会自动回滚。*我的回答详细解释了这一点。

    \n
  • \n
\n

*在这个答案中,我解释了如何使用IN参数创建一个过程,我的答案我的答案分别解释OUT和参数,文档详细解释了一个过程。INOUT

\n

例如,您创建test如下所示的表:

\n
CREATE TABLE test (\n  num int\n);\n
Run Code Online (Sandbox Code Playgroud)\n

然后,插入num如下2所示的行:

\n
INSERT INTO test (num) VALUES (2);\n
Run Code Online (Sandbox Code Playgroud)\n

现在,您可以创建添加到如下所示的addition(IN value INT)过程。*参数可以从调用者那里获取值,你也可以使用,没有它也被识别为参数,基本上,你需要将默认分隔符更改为创建过程时的样子,否则会出错,然后在创建过程之后,您需要将分隔符更改回如下所示,我的答案解释了分隔符,并且您必须在创建过程时选择数据库,否则会出现错误valuenumININ value INTvalue INTININ;$$$$;

\n
DELIMITER $$\n\nCREATE PROCEDURE addition(IN value INT)\nBEGIN\nUPDATE test SET num = num + value;\nEND$$\n\nDELIMITER ;\n
Run Code Online (Sandbox Code Playgroud)\n
DELIMITER $$\n\nCREATE PROCEDURE addition(INOUT v1 INT, INOUT v2 INT)\nBEGIN\nSELECT v1+1, v2+1 into v1, v2;\nEND$$\n\nDELIMITER ;\n
Run Code Online (Sandbox Code Playgroud)\n

然后,可以用addition(3)CALL语句调用,然后3添加num如下所示:

\n
mysql> CALL addition(3);\n...\nmysql> SELECT num FROM test;\n+------+\n| num  |\n+------+\n|  5   |\n+------+\n
Run Code Online (Sandbox Code Playgroud)\n

或者,您可以设置用户定义的会话变量,例如@v使用3,然后3添加到,num如下所示。*用户定义的会话变量的初始值为NULL

\n
mysql> SET @v = 3;\n...\nmysql> CALL addition(@v);\n...\nmysql> SELECT num FROM test;\n+------+\n| num  |\n+------+\n|  5   |\n+------+\n
Run Code Online (Sandbox Code Playgroud)\n

此外,您可以addition()使用用户定义的会话变量(例如@v,不带IN参数)创建过程,如下所示:

\n
DELIMITER $$\n\nCREATE PROCEDURE addition()\nBEGIN                    -- \xe2\x86\x93\xe2\x86\x93 Here\nUPDATE test SET num = num + @v;\nEND$$\n\nDELIMITER ;\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您设置@v3调用addition(), then3添加到num如下所示:

\n
mysql> SET @v = 3;\n...\nmysql> CALL addition();\n...\nmysql> SELECT num FROM test;\n+------+\n| num  |\n+------+\n|  5   |\n+------+\n
Run Code Online (Sandbox Code Playgroud)\n

并且,在下面的情况下,您可以创建addition(IN value INT)不将分隔符更改为而$$不会出现错误的过程:

\n
CREATE PROCEDURE addition(IN value INT)\nUPDATE test SET num = num + value;\n
Run Code Online (Sandbox Code Playgroud)\n


归档时间:

查看次数:

26949 次

最近记录:

7 年,2 月 前