溫馨提示:您的每一次轉(zhuǎn)載,體現(xiàn)了我寫此文的意義!!!煩請(qǐng)您在轉(zhuǎn)載時(shí)注明出處http://www.aygfsteel.com/sxyx2008/謝謝合作!!!

          雪山飛鵠

          溫馨提示:您的每一次轉(zhuǎn)載,體現(xiàn)了我寫此文的意義!!!煩請(qǐng)您在轉(zhuǎn)載時(shí)注明出處http://www.aygfsteel.com/sxyx2008/謝謝合作!!!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            215 Posts :: 1 Stories :: 674 Comments :: 0 Trackbacks
           

          此文檔中除MySQL 存儲(chǔ)過程參數(shù)類型(inoutinout小節(jié)來自網(wǎng)上,其余均為本人原創(chuàng),歡迎大家轉(zhuǎn)載,如有不足,請(qǐng)指教。
          由于是在word中編輯好拷貝過來的所以字體較小大家點(diǎn)此下載電子版文檔

            

          MySQL存儲(chǔ)過程

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

          CREATE PROCEDURE存儲(chǔ)過程名 (參數(shù)列表)
             BEGIN
                   SQL語(yǔ)句代碼塊
          END
          注意:
          由括號(hào)包圍的參數(shù)列必須總是存在。如果沒有參數(shù),也該使用一個(gè)空參數(shù)列()。每個(gè)參數(shù)默認(rèn)都是一個(gè)IN參數(shù)。要指定為其它參數(shù),可在參數(shù)名之前使用關(guān)鍵詞 OUT或INOUT
          mysql客戶端定義存儲(chǔ)過程的時(shí)候使用delimiter命令來把語(yǔ)句定界符從;變?yōu)?/。
          當(dāng)使用delimiter命令時(shí),你應(yīng)該避免使用反斜杠(‘"’)字符,因?yàn)槟鞘?/span>MySQL的轉(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語(yǔ)句代碼塊
          這個(gè)語(yǔ)句可以被用來改變一個(gè)存儲(chǔ)程序的特征。

          1.3         DROP  PROCEDURE (刪除)

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

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

          這個(gè)語(yǔ)句被用來移除一個(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語(yǔ)句(存儲(chǔ)過程的調(diào)用)

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

          CALL語(yǔ)句調(diào)用一個(gè)先前用CREATE PROCEDURE創(chuàng)建的程序。
          CALL語(yǔ)句可以用聲明為OUT或的INOUT參數(shù)的參數(shù)給它的調(diào)用者傳回值。
          存儲(chǔ)過程名稱后面必須加括號(hào),哪怕該存儲(chǔ)過程沒有參數(shù)傳遞

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

          [begin_label:] 
          BEGIN
              [statement_list]
          END 
          [end_label]

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

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

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

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

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

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

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

          1.1             DECLARE局部變量

          DECLARE var_name[,...] type [DEFAULT value]
          這個(gè)語(yǔ)句被用來聲明局部變量。
          要給變量提供一個(gè)默認(rèn)值,請(qǐng)包含一個(gè)DEFAULT子句。
          值可以被指定為一個(gè)表達(dá)式,不需要為一個(gè)常數(shù)。
          如果沒有DEFAULT子句,初始值為NULL
          局部變量的作用范圍在它被聲明的BEGIN ... END塊內(nèi)。
          它可以被用在嵌套的塊中,除了那些用相同名字聲明變量的塊。

          1.2             變量SET語(yǔ)句

          SET var_name = expr [, var_name = expr] 
          在存儲(chǔ)程序中的SET語(yǔ)句是一般SET語(yǔ)句的擴(kuò)展版本。
          被參考變量可能是子程序內(nèi)聲明的變量,或者是全局服務(wù)器變量。
          在存儲(chǔ)程序中的SET語(yǔ)句作為預(yù)先存在的SET語(yǔ)法的一部分來實(shí)現(xiàn)。這允許SET a=x, b=y, ...這樣的擴(kuò)展語(yǔ)法。
          其中不同的變量類型(局域聲明變量及全局和集體變量)可以被混合起來。
          這也允許把局部變量和一些只對(duì)系統(tǒng)變量有意義的選項(xiàng)合并起來。

          1.3             SELECT ... INTO語(yǔ)句

          SELECT col_name[,...] INTO var_name[,...] table_expr
          這個(gè)SELECT語(yǔ)法把選定的列直接存儲(chǔ)到變量。
          因此,只有單一的行可以被取回。
          SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
          注意,用戶變量名在MySQL 5.1中是對(duì)大小寫不敏感的。

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

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

          此小節(jié)內(nèi)容來自:

          參見地址:http://www.aygfsteel.com/nonels/archive/2009/04/22/233324.html

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

          MySQL 存儲(chǔ)過程 “in” 參數(shù):跟 C 語(yǔ)言的函數(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的語(yǔ)法規(guī)則;

          SET @變量名=初始值;

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

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

          相關(guān)APIjava.sql.CallableStatement

          使用到java.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ù)庫(kù)中的記錄數(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();

                  }

              }

          1.13       聲明:

          此文檔中除MySQL 存儲(chǔ)過程參數(shù)類型(inoutinout小節(jié)來自網(wǎng)上,其余均為本人原創(chuàng),歡迎大家轉(zhuǎn)載,如有不足,請(qǐng)指教。

          由于是在word中編輯好拷貝過來的所以字體較小大家點(diǎn)此下載電子文檔

          posted on 2009-11-24 17:12 雪山飛鵠 閱讀(116100) 評(píng)論(30)  編輯  收藏

          Feedback

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2009-11-24 18:03 FOG
          好的很,聊咋了!  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2010-07-12 17:05 淘寶網(wǎng)女裝皇冠店
          MySQL存儲(chǔ)過程  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2011-05-05 22:27 lianjinhui
          太好了.  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2011-12-15 18:40 程序員之家
          好東西啊 謝謝  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2012-03-21 14:22 很受用
          真的很受用!  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程[未登錄] 2012-04-12 15:25 xiao
          不錯(cuò)  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2012-04-24 13:49 黃師傅
          不錯(cuò)  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2012-06-18 17:03 kkkk
          都沒有事務(wù)!  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2012-08-03 15:27 fs
          sdffsdfsdf  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2012-08-03 15:28 fs
          fsdf
            回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2012-09-16 02:14 少年阿賓
          寫得相當(dāng)不錯(cuò),呵呵,學(xué)習(xí)了  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2012-11-04 12:14 sf
          謝謝了!  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2012-12-03 17:50 郭超哈哈哈
          很受用啊,謝謝了  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2012-12-21 12:05 hdn
          奏是滴@FOG
            回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2013-02-03 11:15 litegrass
          感謝樓主  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2013-03-01 09:24 yanlong
          先記下來,呵呵  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2013-03-21 17:25 memory
          給力!  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程[未登錄] 2013-04-08 15:02 w
          多謝!  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程[未登錄] 2013-05-28 19:44
          膜拜 講解的很形象  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程[未登錄] 2013-05-28 19:45
          好好好!  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2013-07-09 14:28 陳念
          謝謝,受教了~  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2013-09-29 15:00 我是來學(xué)修改的
          修改的例子呢 給一個(gè)啊   回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2013-11-27 14:30 陳云展
          最后一個(gè)例子是錯(cuò)誤的。耽誤我半天時(shí)間。希望大家注意了。  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程[未登錄] 2014-01-08 15:42 111
          沒有循環(huán)語(yǔ)句  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2014-01-24 11:01 ddad
          dfdsdff  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2014-02-11 11:04 手表之家
          非常有用,看完入門了  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2014-07-17 11:09 ly
          很好  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2014-08-13 20:36 aaaaaaaaaa
          aaa  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2014-08-22 17:52 俄方違反
          ;了,了  回復(fù)  更多評(píng)論
            

          # re: 跟我學(xué)MySQL存儲(chǔ)過程 2014-08-22 17:52 俄方違反
          啥雞巴玩意  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 荥阳市| 临海市| 南充市| 丹巴县| 黔江区| 南雄市| 牙克石市| 和田市| 邓州市| 固阳县| 汨罗市| 崇文区| 平遥县| 绥宁县| 东兰县| 怀化市| 崇信县| 积石山| 九台市| 栾城县| 尼木县| 四川省| 上犹县| 铁力市| 城固县| 萍乡市| 南宫市| 通道| 当阳市| 高尔夫| 平舆县| 三都| 新邵县| 达孜县| 芜湖市| 涪陵区| 南川市| 平利县| 明星| 陵川县| 齐齐哈尔市|