日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

mysql数据库的存储过程不用学吗,MySql数据库之存储过程学习_MySQL

發(fā)布時(shí)間:2025/3/15 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql数据库的存储过程不用学吗,MySql数据库之存储过程学习_MySQL 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前在工作中總是聽別人提到存儲(chǔ)過程,覺得是個(gè)很高深的東西,利用工作之余,看了下相關(guān)的知識(shí),現(xiàn)將學(xué)習(xí)知識(shí)總結(jié)如下,希望可以為剛學(xué)習(xí)的人提供些許幫助。

開發(fā)環(huán)境:Navicat For Mysql。

MySQL存儲(chǔ)過程

1.1、CREATE PROCEDURE (創(chuàng)建)

CREATE PROCEDURE存儲(chǔ)過程名 (參數(shù)列表)

BEGIN

SQL語句代碼塊

END

注意:

由括號(hào)包圍的參數(shù)列必須總是存在。如果沒有參數(shù),也該使用一個(gè)空參數(shù)列()。每個(gè)參數(shù)默認(rèn)都是一個(gè)IN參數(shù)。要指定為其它參數(shù),可在參數(shù)名之前使用關(guān)鍵詞 OUT或INOUT

實(shí)例演練:

eg1,帶(輸出參數(shù))返回值的存儲(chǔ)過程:

1、建表

create table abin5(

id int,

name5 VARCHAR(39)

)

2、創(chuàng)建存儲(chǔ)過程

create procedure pabin5(out n int)

BEGIN

select count(*) from abin5;

END

3、測試存儲(chǔ)過程

call pabin5(@n)

eg2,帶輸入?yún)?shù)的存儲(chǔ)過程:

1、建立存儲(chǔ)過程

create procedure pabin6(in n int)

BEGIN

SELECT * FROM abin5 where id=n;

END

2、測試存儲(chǔ)過程

SET @n=1;

CALL pabin6(@n)

或者

CALL pabin6(1)

在mysql客戶端定義存儲(chǔ)過程的時(shí)候使用delimiter命令來把語句定界符從;變?yōu)?/。

當(dāng)使用delimiter命令時(shí),你應(yīng)該避免使用反斜杠(‘"’)字符,因?yàn)槟鞘荕ySQL的轉(zhuǎn)義字符。

如:

mysql> delimiter //

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)

-> BEGIN

-> SELECT COUNT(*) INTO param1 FROM t;

-> END

-> //

Query OK, 0 rows affected (0.00 sec)

1.2 ALTER PROCEDURE (修改)

ALTER PROCEDURE 存儲(chǔ)過程名SQL語句代碼塊

這個(gè)語句可以被用來改變一個(gè)存儲(chǔ)程序的特征。

1.3 DROP PROCEDURE (刪除)

DROP PROCEDURE IF EXISTS存儲(chǔ)過程名

eg:DROP PROCEDURE IF EXISTS proc_employee (proc_employee 存儲(chǔ)過程名)

這個(gè)語句被用來移除一個(gè)存儲(chǔ)程序。不能在一個(gè)存儲(chǔ)過程中刪除另一個(gè)存儲(chǔ)過程,只能調(diào)用另一個(gè)存儲(chǔ)過程

1.4 SHOW CREATE PROCEDURE(類似于SHOW CREATE TABLE,查看一個(gè)已存在的存儲(chǔ)過程)

SHOW CREATE PROCEDURE 存儲(chǔ)過程名

1.5 SHOW PROCEDURE STATUS (列出所有的存儲(chǔ)過程)

SHOW PROCEDURE STATUS

1.6 CALL語句(存儲(chǔ)過程的調(diào)用)

CALL 存儲(chǔ)過程名(參數(shù)列表)

CALL語句調(diào)用一個(gè)先前用CREATE PROCEDURE創(chuàng)建的程序。

CALL語句可以用聲明為OUT或的INOUT參數(shù)的參數(shù)給它的調(diào)用者傳回值。

存儲(chǔ)過程名稱后面必須加括號(hào),哪怕該存儲(chǔ)過程沒有參數(shù)傳遞

1.7 BEGIN ... END(復(fù)合語句)

[begin_label:]

BEGIN

[statement_list]

END

[end_label]

存儲(chǔ)子程序可以使用BEGIN ... END復(fù)合語句來包含多個(gè)語句。

statement_list 代表一個(gè)或多個(gè)語句的列表。statement_list之內(nèi)每個(gè)語句都必須用分號(hào)(;)來結(jié)尾。

復(fù)合語句可以被標(biāo)記。除非begin_label存在,否則end_label不能被給出,并且如果二者都存在,他們必須是同樣的。

1.8 DECLARE語句(用來聲明局部變量)

DECLARE語句被用來把不同項(xiàng)目局域到一個(gè)子程序:局部變量

DECLARE僅被用在BEGIN ... END復(fù)合語句里,并且必須在復(fù)合語句的開頭,在任何其它語句之前。

1.9 存儲(chǔ)程序中的變量

1.1 DECLARE局部變量

DECLARE var_name[,...] type [DEFAULT value]

這個(gè)語句被用來聲明局部變量。

要給變量提供一個(gè)默認(rèn)值,請(qǐng)包含一個(gè)DEFAULT子句。

值可以被指定為一個(gè)表達(dá)式,不需要為一個(gè)常數(shù)。

如果沒有DEFAULT子句,初始值為NULL。

局部變量的作用范圍在它被聲明的BEGIN ... END塊內(nèi)。

它可以被用在嵌套的塊中,除了那些用相同名字聲明變量的塊。

1.2 變量SET語句

SET var_name = expr [, var_name = expr]

在存儲(chǔ)程序中的SET語句是一般SET語句的擴(kuò)展版本。

被參考變量可能是子程序內(nèi)聲明的變量,或者是全局服務(wù)器變量。

在存儲(chǔ)程序中的SET語句作為預(yù)先存在的SET語法的一部分來實(shí)現(xiàn)。這允許SET a=x, b=y, ...這樣的擴(kuò)展語法。

其中不同的變量類型(局域聲明變量及全局和集體變量)可以被混合起來。

這也允許把局部變量和一些只對(duì)系統(tǒng)變量有意義的選項(xiàng)合并起來。

1.3 SELECT ... INTO語句

SELECT col_name[,...] INTO var_name[,...] table_expr

這個(gè)SELECT語法把選定的列直接存儲(chǔ)到變量。

因此,只有單一的行可以被取回。

SELECT id,data INTO x,y FROM test.t1 LIMIT 1;

注意,用戶變量名在MySQL 5.1中是對(duì)大小寫不敏感的。

重要: SQL變量名不能和列名一樣。如果SELECT ... INTO這樣的SQL語句包含一個(gè)對(duì)列的參考,并包含一個(gè)與列相同名字的局部變量,MySQL當(dāng)前把參考解釋為一個(gè)變量的名字。

1.10 MySQL 存儲(chǔ)過程參數(shù)類型(in、out、inout)

MySQL 存儲(chǔ)過程參數(shù)(in)

MySQL 存儲(chǔ)過程 “in” 參數(shù):跟 C 語言的函數(shù)參數(shù)的值傳遞類似, MySQL 存儲(chǔ)過程內(nèi)部可能會(huì)修改此參數(shù),但對(duì) in 類型參數(shù)的修改,對(duì)調(diào)用者(caller)來說是不可見的(not visible)。

MySQL 存儲(chǔ)過程參數(shù)(out)

MySQL 存儲(chǔ)過程 “out” 參數(shù):從存儲(chǔ)過程內(nèi)部傳值給調(diào)用者。在存儲(chǔ)過程內(nèi)部,該參數(shù)初始值為 null,無論調(diào)用者是否給存儲(chǔ)過程參數(shù)設(shè)置值

MySQL 存儲(chǔ)過程參數(shù)(inout)

MySQL 存儲(chǔ)過程 inout 參數(shù)跟 out 類似,都可以從存儲(chǔ)過程內(nèi)部傳值給調(diào)用者。不同的是:調(diào)用者還可以通過 inout 參數(shù)傳遞值給存儲(chǔ)過程。

總結(jié)

如果僅僅想把數(shù)據(jù)傳給 MySQL 存儲(chǔ)過程,那就使用“in” 類型參數(shù);如果僅僅從 MySQL 存儲(chǔ)過程返回值,那就使用“out” 類型參數(shù);如果需要把數(shù)據(jù)傳給 MySQL 存儲(chǔ)過程,還要經(jīng)過一些計(jì)算后再傳回給我們,此時(shí),要使用“inout” 類型參數(shù)。

1.11 例子:

1.1 創(chuàng)建存儲(chǔ)過程

帶(輸出參數(shù))返回值的存儲(chǔ)過程:

--刪除存儲(chǔ)過程

DROP PROCEDURE IF EXISTS proc_employee_getCount

--創(chuàng)建存儲(chǔ)過程

CREATE PROCEDURE proc_employee_getCount(out n int)

BEGIN

SELECT COUNT(*) FROM employee ;

END

--MYSQL調(diào)用存儲(chǔ)過程

CALL proc_employee_getCount(@n);

帶輸入?yún)?shù)的存儲(chǔ)過程:

--刪除存儲(chǔ)過程

DROP PROCEDURE IF EXISTS proc_employee_findById;

--創(chuàng)建存儲(chǔ)過程

CREATE PROCEDURE proc_employee_findById(in n int)

BEGIN

SELECT * FROM employee where id=n;

END

--定義變量

SET @n=1;

--調(diào)用存儲(chǔ)過程

CALL proc_employee_findById(@n);

操作存儲(chǔ)過程時(shí)應(yīng)注意:

1. 刪除存儲(chǔ)過程時(shí)只需要指定存儲(chǔ)過程名即可,不帶括號(hào);

2. 創(chuàng)建存儲(chǔ)過程時(shí),不管該存儲(chǔ)過程有無參數(shù),都需要帶括號(hào);

3. 在使用SET定義變量時(shí)應(yīng)遵循SET的語法規(guī)則;

SET @變量名=初始值;

4. 在定義存儲(chǔ)過程參數(shù)列表時(shí),應(yīng)注意參數(shù)名與數(shù)據(jù)庫中字段名區(qū)別開來,否則將出現(xiàn)無法預(yù)期的結(jié)果

1.12 Java代碼調(diào)用存儲(chǔ)過程(JDBC)

相關(guān)API:java.sql.CallableStatement

使用到j(luò)ava.sql.CallableStatement接口,該接口專門用來調(diào)用存儲(chǔ)過程;

該對(duì)象的獲得依賴于java.sql.Connection;

通過Connection實(shí)例的prepareCall()方法返回CallableStatement對(duì)象

prepareCall()內(nèi)部為一固定寫法{call 存儲(chǔ)過程名(參數(shù)列表1,參數(shù)列表2)}可用?占位

eg: connection.prepareCall("{call proc_employee(?)}");

存儲(chǔ)過程中參數(shù)處理:

輸入?yún)?shù):通過java.sql.CallableStatement實(shí)例的setXXX()方法賦值,用法等同于java.sql.PreparedStatement

輸出參數(shù):通過java.sql.CallableStatement實(shí)例的registerOutParameter(參數(shù)位置, 參數(shù)類型)方法賦值,其中參數(shù)類型主要使用java.sql.Types中定義的類型

Java代碼調(diào)用帶輸入?yún)?shù)的存儲(chǔ)過程 (根據(jù)輸入ID查詢雇員信息)

publicvoid executeProcedure()

{

try {

/**

*callableStatementjava.sql.CallableStatement

*connectionjava.sql.Connection

*jdbc調(diào)用存儲(chǔ)過程原型

*{call存儲(chǔ)過程名(參數(shù)列表1,參數(shù)列表2)}可用?代替

*/

callableStatement=connection.prepareCall("{call proc_employee_findById(?)}");

callableStatement.setInt(1, 1); //設(shè)置輸入?yún)?shù)

resultSet=callableStatement.executeQuery();//執(zhí)行存儲(chǔ)過程

if(resultSet.next())

{

System.out.println(resultSet.getInt(1)+""t"+resultSet.getString(2));

}

} catch (SQLException e) {

e.printStackTrace();

}

}

Java代碼調(diào)用帶輸出參數(shù)的存儲(chǔ)過程 (返回?cái)?shù)據(jù)庫中的記錄數(shù))

publicvoid executeProcedure()

{

try {

/**

*callableStatementjava.sql.CallableStatement

*connectionjava.sql.Connection

*jdbc調(diào)用存儲(chǔ)過程原型

*{call存儲(chǔ)過程名(參數(shù)列表1,參數(shù)列表2)}可用?代替

*/

callableStatement=connection.prepareCall("{call proc_employee_getCount(?)}");

//設(shè)置輸出參數(shù)

callableStatement.registerOutParameter(1, Types.INTEGER);

//執(zhí)行存儲(chǔ)過程

resultSet=callableStatement.executeQuery();

if(resultSet.next())

{

System.out.println(resultSet.getInt(1));

}

} catch (SQLException e) {

e.printStackTrace();

}

}

本條技術(shù)文章來源于互聯(lián)網(wǎng),如果無意侵犯您的權(quán)益請(qǐng)點(diǎn)擊此處反饋版權(quán)投訴

本文系統(tǒng)來源:php中文網(wǎng)

TAG標(biāo)簽:過程數(shù)據(jù)庫

總結(jié)

以上是生活随笔為你收集整理的mysql数据库的存储过程不用学吗,MySql数据库之存储过程学习_MySQL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。