<h1>一、存储过程</h1>
<h2>1、介绍</h2>
<p><span style="color:#000000;">简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;</span></p>
<p>存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。</p>
<p>存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。</p>
<p>存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。</p>
<h2>2、优缺点</h2>
<h3>优点:</h3>
<ul><li>存储过程可封装,并隐藏复杂的商业逻辑。</li><li>存储过程可以回传值,并可以接受参数。</li><li>存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。</li><li>存储过程可以用在数据检验,强制实行商业逻辑等。</li><li> <p style="margin-left:0pt;"><span style="color:#000000;">在生产环境下,可以通过直接修改存储过程的方式修改业务逻辑(或bug),而不用重启服务器(人直接就在正式服务器上修改存储过程,而没有经过完整的测试,后果非常严重。)</span></p> </li><li> <p style="margin-left:0pt;"><span style="color:#000000;">执行速度快。存储过程经过编译之后会比单独一条一条执行要快。但这个效率真是没太大影响。如果是要做大数据量的导入、同步,我们可以用其它手段。</span></p> </li><li> <p style="margin-left:0pt;"><span style="color:#000000;">减少网络传输。存储过程直接就在数据库服务器上跑,所有的数据访问都在服务器内部进行,不需要传输数据到其它终端。但我们的应付服务器通常与数据库是在同一内网,大数据的访问的瓶颈会是硬盘的速度,而不是网速。</span></p> </li><li> <p style="margin-left:0pt;"><span style="color:#000000;">能够解决presentation(把属性映射到字段)与数据之间的差异(解决OO模型与二维数据持久化之间的阻抗)</span></p> </li></ul>
<h3>缺点:</h3>
<ul><li>存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。</li><li>存储过程的性能调校与撰写,受限于各种数据库系统。</li><li> <p style="margin-left:0pt;"><span style="color:#000000;">不便于调试。基本上没有较好的调试器</span></p> </li><li> <p style="margin-left:0pt;"><span style="color:#000000;">没办法应用缓存。虽然有全局临时表之类的方法可以做缓存</span></p> </li><li> <p style="margin-left:0pt;"><span style="color:#000000;">无法适应数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。</span></p> </li></ul>
<h2 style="margin-left:0pt;">3、创建</h2>
<h3>*创建</h3>
<pre class="blockcode"><code>#创建
CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body
CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体</code></pre>
<p>其中,sp_name参数是存储过程的名称;proc_parameter表示存储过程的参数列表; characteristic参数指定存储过程的特性;routine_body参数是SQL代码的内容,可以用BEGIN…END来标志SQL代码的开始和结束。</p>
<h3>*分隔符</h3>
<p>MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个"//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。</p>
<pre class="blockcode"><code>DELIMITER $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
存储过程语句
$$
DELIMITER;
或
DELIMITER //
存储过程语句
//
DELIMITER ;</code></pre>
<h3>*参数(参数类型、参数名、数据类型)</h3>
<p>存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。</p>
<p><strong>a.参数类型</strong></p>
<p>MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:</p>
<ul><li>IN输入参数,不被输出</li><li>OUT:不用输入,直接输出</li><li>INOUT:输入,执行后输出</li></ul>
<p><strong>b.参数名</strong></p>
<p>可以自定义</p>
<p><strong>c.数据类型(见<a href="https://blog.csdn.net/h18733517027/article/details/94721139">mysql全家桶(一)数据库以及表操作</a>的</strong>字段类 |
|