1. 程式人生 > >初學mysql(十)-資料庫之儲存過程、函式與遊標-自定義函式和流程控制(下)

初學mysql(十)-資料庫之儲存過程、函式與遊標-自定義函式和流程控制(下)

上一篇部落格講了儲存過程、函式、以及遊標,這一篇部落格接著上一篇部落格來說。首先說說mysql資料庫中的流程控制及自定義函式的使用。

自定義函式:

根據所需要的功能,使用流程控制來完成所需要的功能,完成功能的程式碼就稱為自定義函式。要想完成自定義函式就必須學會流程控制的使用。儲存過程和函式可以使用流程控制來控制語句的執行。MYSQL中可以使用IF語句、case語句、loop語句、leave語句、iterate語句、while語句來實現流程的控制。和Java、c、c++的使用有些類似,不過還是有些區別的。

表t_user,表t_user1,欄位1 id, 欄位2 userName, 欄位3 job, 欄位4 jobtypeid

create table t_user(
      id int primary key auto_increment,
      userName varchar(20) ,
      job  varchar(20),
      jobTypeId int,
      constraint `fk` foreign key(jobTypeId) references t_jobs(id)
);
create table t_user1(
     id int primary key auto_increment,
     userName varchar(20) ,
     job  varchar(20),
     jobTypeId int
);

 表t_jobs,欄位1 id, 欄位2 jobtypeName, 欄位3 jobNum

create table t_jobs(
    id int primary key auto_increment,
    jobTypeName varchar(20),
    jobNum int
);

1):IF語句的使用。

IF語句格式: if search_condition(判斷條件) then statement_list(執行語句,可以為一條或者多條)
         [elseif  search_condition then statement_list]...
         [else statements_list]
end if

例子:輸入id判斷是否有這個id記錄如果有修改其工作職位和工作型別id,沒有的話插入其記錄。     

delimiter &&
    create procedure pro_user(in uid int)
    begin
         select count(*) into @nums from t_user where id = uid;
          if @nums > 0 then update t_user set job='飛行員',jobtypeid=6 where id = uid;
          elseif @nums = 0 then insert into t_user values(null, '楊利偉', '飛行員', 6);
           else insert into t_user values(null, '楊利偉', '飛行員', 6);
           end if;
     end
&&

呼叫儲存過程:

call pro_user(1);

2):case語句的使用。    

    case語句格式1:case  case_value(條件判斷表示式)
                  when when_value(可能取的值) then statement_list(執行語句)
                  [when when_value(可能取的值) then statement_list(執行語句)]...
                  [else statement_list(執行語句)]
                  end case
 case語句格式2:case
                when search_condition(條件判斷語句) then statement_list(執行語句)
                [when search_condition(條件判斷語句) then statement_list(執行語句)]...
                [else statement_list(執行語句)]
                end case

例子:輸入指定Id檢視是否有這個人,有的話修改其userName,job,jobTypeID否則插入此記錄。

形式1:

delimiter &&
     create procedure pro_user1(in uid int)
      begin
           select count(*) into @nums from t_user where id = uid;
            case @nums
            when 1 then update t_user set job='平民', jobTypeId=0 where id = uid;
            when 0 then insert into t_user values(null, '希拉里', '平民', 0) ;
             else insert into t_user values(null, '希拉里', '平民', 0);
          end case;
     end
&&

形式2:

delimiter &&
      create procedure pro_user1(in uid int)
      begin
          select count(*) into @nums from t_user where id = uid;
          case
          when @nums = 0 then insert into t_user values(null, '希拉里', '平民', 0);
          when @nums = 1 then update t_user set job='平民', jobTypeId=0 where id = uid;
           else insert into t_user values(null, '希拉里', '平民', 0);
       end case;
   end
&&

呼叫:call pro_user1(2);

3):loop、leave語句;loop可以使某些特定的語句重複執行 ,實現一個簡單的迴圈,但是loop本身沒有停止迴圈的語句,必須是遇到leave語句才能停止迴圈。

loop語法格式:                  

[begin label:]loop
statement_list
end loop[end_label]

 leave語法格式:

leave label

例子:把t_user表中的n條資料全部匯入t_user1表中做備份。           

delimiter &&
      create procedure pro_user2(in n int)
      begin
            declare a,b varchar(20);
            declare c int;
            abc:loop
                if n =0 then leave abc;
                else
                   select userName, job, jobTypeId into a,b,c from t_user where id = n;
                    insert into t_user1 values(null, a, b, c);
                    set n = n - 1;
                 end if;
               end loop abc; 
        end
&&

呼叫:call pro_user2(10);

4):iterate語句。iterate用來跳出迴圈,但是它只是跳出本次迴圈執行下一次迴圈類似與java的continue語句。

iterate語法:iterate label;

例子:例子把t_user表中的資料備份到t_user1表中,是id為4的倍數的不備份。

delimiter &&
    create procedure pro_user3(in n int)
    begin
         declare a,b varchar(20);
         declare c int;
         abc:loop
               set n = n - 1;
               if n = 0 then leave abc;
               elseif (n%3)=0 then iterate abc;
               else
                     select userName, job,jobTypeId into a,b,c from t_user where id = n;
                     insert into t_user1 values(null, a,b,c);
                end if;
                end loop abc;
    end
&&

 呼叫:call pro_user3(10);

5):repeat語句。repeat語句有條件的迴圈控制語句。當滿足特定條件時,就會跳出迴圈語句。

repeat語法:[begin_label: ]repeat

                   statement_list

                   until search_condition

                   end repeat[end_label]

例子:插入10條重複的記錄到t_user1表中(這個例子比較簡單,讀者可以仿照上面寫把t_user表中的n條記錄備份到t_user1表中)。

delimiter &&
    create procedure pro_user4(in n int)
    begin
            repeat  set n = n - 1;
            insert into t_user1 values(null, '希拉里', '平民', 0);
           until n = 0
          end repeat;
    end
&&

備份記錄:

呼叫:call pro_user4(10);

6)while語句。

 while語法:[begin_label:] while search_condition do

                 statement_list 

                 end while[end_label]

例子:插入10條重複的記錄到t_user1表中(這個例子比較簡單,讀者可以仿照上面寫把t_user表中的n條記錄備份到t_user1表中) 

delimiter &&
    create procedure pro_user5(in n int)
    begin
          while n > 0 do
                 insert into t_user1 values(null, ‘川普’,'總統', 1);
                set n = n - 1;
        end while;
    end
&&

呼叫:

call pro_user5(10);

A:呼叫儲存過程和函式:

       呼叫儲存過程:語法:call 儲存過程名字sp_name(引數1,引數2....);  如:call  pro_user(10)

       呼叫函式:語法:fun_name(引數1,引數2,.....); 如:call func_user(10);

B:檢視儲存過程或函式的3種方式

     1檢視狀態:

show {procedure|function}  status [like '儲存過程或函式的名字']

如:

show procedure status like 'pro_user';

2檢視儲存過程或函式的定義:

show create {procedure|function} 儲存過程或函式的名字

如:

show create procedure pro_user;

 3從information——schema.routines表中檢視儲存過程或函式的資訊。

  C:修改儲存過程或函式;一般不建議這樣做,因為這樣容易產生不可發現的不正確資訊,一般建議刪除重新編寫。

     語法:

alter {procedure|function} 名字[characteristic...]
 characteristic:{contains sql} no sql | read sql data | modifies sql data}
 | sql security {definer | invoker}
 | comment 'string'

D:刪除儲存過程或函式:

語法:

drop  {procedure | function} 名字;

例子:

drop procedure pro_user ; drop function func_user;

上面思考題答案:用repeat和while把t_user表中指定的記錄條數的資料備份到t_user1表中。

delimiter  &&
   create procedure pro_user(in counts int)
   begin
            declare a,b varchar(20);
            declare c int;
            repeat set counts = counts-1;
                 select userName,job,jobTypeId into a,b,c from t_user where id = counts;
                 insert into t_user1 values(null, a,b, c);
           until n = 0
          end repeat;
   end
&&

相關推薦

初學mysql()-資料庫儲存過程函式遊標-定義函式流程控制

上一篇部落格講了儲存過程、函式、以及遊標,這一篇部落格接著上一篇部落格來說。首先說說mysql資料庫中的流程控制及自定義函式的使用。 自定義函式: 根據所需要的功能,使用流程控制來完成所需要的功能,完成功能的程式碼就稱為自定義函式。要想完成自定義函式就必須學會流程控制的使

MySQL資料庫儲存過程

儲存過程(Stored Procedure):一組可程式設計的函式,是為了完成特定功能的SQL語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數(需要時)來呼叫執行。 為什麼

MySQL資料庫儲存過程儲存函式

1 引言         儲存過程和儲存函式類似於面向物件程式設計語言中的方法,可以簡化程式碼,提高程式碼的重用性。本文主要介紹如何建立儲存過程和儲存函式,以及儲存過程與函式的使用、修改、刪除等操作。 2 儲存過程與儲存函式     MySQL中提供儲存過程與儲存

MySQL基礎系列 儲存過程函式

摘要:儲存過程和函式是事先經過編譯並存儲在資料庫中的一段SQL語句的集合 儲存過程無返回值,函式有返回值 儲存過程的引數可以使用IN、OUT、INOUT,函式只能使用IN 建立儲存過程 CREATE PROCEDURE 建立函式使用 CREATE FUNCTION 使用CALL語句來呼叫

sqlserver查詢資料庫所有儲存過程觸發器索引資訊

1. 查詢所有儲存過程 select Pr_Name as [儲存過程], [引數]=stuff((select ','+[Parameter] from ( select Pr.Name as Pr

oracle查詢資料庫儲存過程索引檢視等的數量

select count(1) from user_objects where object_type = 'PROCEDURE' select count(1) from user_objects where object_type = 'INDEX' select co

mysql筆記三-----sql儲存過程事務的隔離級別sql各查詢的區別防黑

儲存過程 ※※儲存過程※※※ 定義: create procedure 過程名(引數) begin 多條sql語句 end 呼叫: call 過程名(實參) 例項1--無參的儲存過程: △小細節:要把預設的語句結束“;”號改成其它如“$$”,

資料庫儲存過程Procedure

資料庫之儲存過程 一、概述 SQLserver中檢視通過簡單的select查詢來解決複雜的查詢,但是檢視不能提供業務邏輯功能,而儲存過程可以辦到。 二、什麼是儲存過程 儲存過程procedure是一組為了完成特定功能的SQL語句的集合,經編譯後儲存儲存在資料庫中,使用者通過制定儲存過程的名稱big給出引

SQL儲存過程分頁遊標使用

儲存過程: CREATE procedure p_splitpage    @sql nvarchar(4000), --要執行的sql語句  @page int=1,    --要顯示的頁碼 @pageSize int,&n

LinuxMySQL 5.55.65.7的RPM二進位制原始碼安裝

[[email protected] ~]# df -h Filesystem                                Size  Used Avail Use% Mounted on /dev/mapper/vg_rootlhr-Vol00              9.9

儲存過程使用者定義函式SQL SERVER

聯絡 二者本質上沒有什麼區別。當儲存過程和函式被執行的時候,SQL Manager會到procedure cache中去取相應的查詢語句,如果在procedure cache裡沒有相應的查詢語句,SQL Manager就會對儲存過程和函式進行編譯。Pr

《Java虛擬機原理圖解》 1.2.3Class文件裏的常量池具體解釋

and 支持 術語 一個 handle per ret mod make NO9.類中引用到的field字段在常量池中是如何描寫敘述的?(CONSTANT_Fieldref_info, CONSTANT_Name_Type_info) 一般而言。我們在定義

zabbix定義使用者數監控模組配置

注:zabbix自定義語法 UserParameter=<key>,<shell command> 一、修改agentd端配置檔案 法一:單獨引出配置檔案 [[email protected] ~]# cd /etc/zabbix/zabbix

linux學習筆記流程控制if分支語句

流程控制 if語句 單分支if語句 程式 fi``` ```if [ 判斷 ] then 程式 fi``` 例項程式碼指令碼: #!/bin/bash

linux學習筆記shell程式設計流程控制3---for迴圈

for迴圈 語法格式1:指定迴圈範圍 for 變數 in value1 value2... do something done 指令碼例項1 #!/bin/bash for i in 1 2

linux學習筆記shell程式設計流程控制4while迴圈until迴圈

while迴圈和until迴圈 ###、 while迴圈 不定迴圈,程式碼格式: while [判斷] do something done 指令碼例項1: #!/bin/bash #從1加到

Oracle:PL/SQL--流程控制——迴圈結構:loopwhile-loopfor-loop

—–流程控制(三) —–迴圈結構 —–1、loop迴圈 語法: loop statements; end loop; —–實現計數器功能,當計數器為10或者大於10時退出 declare v_count integer :=

【jmeter二次開發】二Jmeter擴充套件--實現定義函式ApacheJMeter_functions

Jmater函式擴充套件的步驟1、 匯入Jmeter原始碼,或使用maven專案,引入依賴的jar包2、 繼承AbstractFunction,實現自定義Function3、 繼承JMeterTestCase,對自定義的函式進行單元測試4、 對自定義函式進行編譯打包,並放在l

MYSQL筆記3】MYSQL過程式資料庫物件儲存過程的呼叫刪除修改

mysql從5.0版本開始支援儲存過程、儲存函式、觸發器和事件功能的實現。 我們以一本書中的例題為例:建立xscj資料庫的儲存過程,判斷兩個輸入的引數哪個更大。並呼叫該儲存過程。 (1)呼叫 首先,建立儲存過程(procedure),名為xscj.compar delimiter $$ crea

mysql資料庫學習11-儲存過程函式觸發器

儲存的程式 ========================================   * 資料庫中儲存的程式,對資料進行運算處理      * 儲存過程   * 函式   * 觸發器    會話變數