MySQL之視圖、預存程序、觸發器、函數、事務、動態執行SQL

來源:互聯網
上載者:User

標籤:mysql 函數 預存程序 事務

視圖

視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句擷取動態資料集,並為其命名】,使用者使用時只需使用【名稱】即可擷取結果集,並可以將其當作表來使用。


建立視圖:

create view v1 asselect * from student where id > 100;

今後可以直接通過:

select * from v1;   #直接存取學生ID大於100的資訊

刪除視圖:

drop view v1;

修改視圖:

alter view v1 asselect id,name from student where id<10 and name=dandan;

注意:使用視圖時,將其當作表進行操作即可,由於視圖是虛擬表,所以使用其對真實表進行建立、更新和刪除操作,僅能做查詢用。

觸發器

對某個表進行【增/刪/改】操作的前後如果希望觸發某個特定的行為時,可以使用觸發器,觸發器用於定製使用者對錶的行進行【增/刪/改】前後的行為。


建立觸發器:

delimiter //create trigger tg_before_insert_student before insert on student for each rowbegin    if new.name==‘alex‘ then    insert into student_back (name) values (‘alex_back‘);end //delimiter ;

也可以用 after insert 表示插入之後執行觸發器中語句,還有其他動作:before update、after update、before delete 、after delete

注意:NEW表示即將插入的資料行,OLD表示即將刪除的資料行


刪除觸發器:drop tgigger tg_before_insert_student


觸發器無法由使用者直接調用,而知由於對錶的【增/刪/改】操作被動引發的。

預存程序


預存程序是一個SQL語句集合,當主動去調用預存程序時,其中內部的SQL語句會按照邏輯執行。

-- 建立預存程序delimiter //create procedure p1()BEGIN    select * from t1;END//delimiter ;-- 執行預存程序call p1()

對於預存程序,可以接受參數,其參數類型有三類:

    in 只用於傳入參數

    out 用於傳回值

    inout 即可以傳入又可以當作傳回值


有參數的預存程序:

-- 建立預存程序delimiter \create procedure p1(    in i1 int,    in i2 int,    inout i3 int,    out r1 int)BEGIN    DECLARE temp1 int;    DECLARE temp2 int default 0;        set temp1 = 1;    set r1 = i1 + i2 + temp1 + temp2;        set i3 = i3 + 100;end\delimiter ;-- 執行預存程序set @t1 =4;set @t2 = 0;CALL p1 (1, 2 ,@t1, @t2);SELECT @t1,@t2;

結果集加傳回值:

delimiter //                    create procedure p2(                        in n1 int,                        inout n3 int,                        out n2 int,                    )                    begin                        declare temp1 int ;                        declare temp2 int default 0;                        select * from v1;                        set n2 = n1 + 100;                        set n3 = n3 + n1 + 100;                    end //                    delimiter ;

事務型預存程序:

delimiter \                        create PROCEDURE p1(                            OUT p_return_code tinyint                        )                        BEGIN                           DECLARE exit handler for sqlexception                           BEGIN                             -- ERROR                             set p_return_code = 1;                             rollback;                           END;                                                    DECLARE exit handler for sqlwarning                           BEGIN                             -- WARNING                             set p_return_code = 2;                             rollback;                           END;                                                    START TRANSACTION;                             DELETE from tb1;                            insert into tb2(name)values(‘seven‘);                          COMMIT;                                                    -- SUCCESS                           set p_return_code = 0;                                                    END\                    delimiter ;

遊標:

delimiter //                    create procedure p3()                    begin                         declare ssid int; -- 自訂變數1                          declare ssname varchar(50); -- 自訂變數2                          DECLARE done INT DEFAULT FALSE;                        DECLARE my_cursor CURSOR FOR select sid,sname from student;                        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;                                                open my_cursor;                            xxoo: LOOP                                fetch my_cursor into ssid,ssname;                                if done then                                     leave xxoo;                                END IF;                                insert into teacher(tname) values(ssname);                            end loop xxoo;                        close my_cursor;                    end  //                    delimter ;

動態執行SQL:

delimiter \                    CREATE PROCEDURE p4 (                        in nid int                    )                    BEGIN                        PREPARE prod FROM ‘select * from student where sid > ?‘;                        EXECUTE prod USING @nid;                        DEALLOCATE prepare prod;                     END\                    delimiter ;

刪除預存程序:drop procedure proc_name;

執行預存程序:

-- 無參數call proc_name()-- 有參數,全incall proc_name(1,2)-- 有參數,有in,out,inoutset @t1=0;set @t2=3;call proc_name(1,2,@t1,@t2)

函數

MySql中的函數分為:內建函數、自訂函數

內建函數參考:

http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#encryption-functions

自訂函數:

delimiter \create function f1(    i1 int,    i2 int)returns intBEGIN    declare num int;    set num = i1 + i2;    return(num);END \delimiter ;


MySQL之視圖、預存程序、觸發器、函數、事務、動態執行SQL

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.