存儲過程

--存儲過程(Stored Procedure)是在大型數據庫系統中,一組爲了完成特定功能的SQL語句集,
    存儲在數據庫中,通過第一次編譯後再次調用不須要再次編譯,
    用戶經過指定存儲過程的名字並給出參數(若是該存儲過程帶有參數)來執行它.
--觸發器是一種特殊類型的存儲過程
1、查詢、刪除、調用存儲過程
    1.查看因此的存儲過程
        --show procedure status;
    2.查看某個存儲過程
        --show create procedure "proc_name";
    3.刪除存儲過程
        --drop procedure proc_name;
        --注:不能在一個存儲過程當中刪除另外一個存儲過程,只能調用另外一個存儲過程
    4.調用存儲過程
        -- exec proc_name [參數名]
        -- Oracle 使用 call proc_name( param1, param2…);
2、建立存儲過程
-->基本語法:
        create procedure sp_name
        @[參數名] [類型],@[參數名] [類型]
        as
        begin
        ......sql_statement 
        end
    --注意:存儲過程名字不能夠以阿拉伯數字開頭。
    1. sp_name :存儲過程名不能超過128個字
    2. 參數前面必須加@ 
-- 例1:
    CREATE PROCEDURE proc1(IN parameter1 INT)   
    BEGIN   
        DECLARE variable1 CHAR(10);   
        IF parameter1 = 17 THEN   
            SET variable1 = 'birds';   
        ELSE 
            SET variable1 = 'beasts';   
        END IF;   
        INSERT INTO table1 VALUES (variable1);  
    END   前端


-->sql Server語法:
    CREATE PROC [ EDURE ] procedure_name [ ;number ]
    [ { @parameter data_type }
        [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]
    [ WITH
        { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
    [ FOR REPLICATION ]
    AS sql_statement [ ...n ]mysql

    1.procedure_name:存儲過程的名稱,在前面加 # 爲局部臨時存儲過程,加 ## 爲全局臨時存儲過程。
    2.;number :是可選的整數,用來對同名的過程分組,
        以便用一條 DROP PROCEDURE 語句便可將同組的過程一塊兒除去
    3. @parameter: 存儲過程的參數,最多能夠有2100個參數,
        參數只能代替常量,而不能用於代替表名、列名或其它數據庫對象的名稱.
    4.data_type:參數的數據類型。cursor 數據類型只能用於 OUTPUT 參數。
    5.VARYING: 指定做爲輸出參數支持的結果集(由存儲過程動態構造,內容能夠變化)。僅適用於遊標參數。 
    6.default:參數的默認值。若是定義了默認值,沒必要指定該參數的值便可執行過程。默認值必須是常量或 NULL。
        若是過程將對該參數使用 LIKE 關鍵字,那麼默認值中能夠包含通配符(%、_、[] 和 [^])。
    7.OUTPUT: 代表參數是返回參數。使用 OUTPUT 關鍵字的輸出參數能夠是遊標佔位符。 
    --IN 輸入參數
        表示該參數的值必須在調用存儲過程時指定,在存儲過程當中修改該參數的值不能被返回,爲默認值
    --OUT 輸出參數
        該值可在存儲過程內部被改變,並可返回
    --INOUT 輸入輸出參數
        調用時指定,而且可被改變和返回
    8.RECOMPILE: 代表 SQL Server 不會緩存該過程的計劃,該過程將在運行時從新編譯。
        在使用非典型值或臨時值而不但願覆蓋緩存在內存中的執行計劃時,請使用 RECOMPILE 選項。
    9.ENCRYPTION: 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 語句文本的條目。
    10.FOR REPLICATION :指定不能在訂閱服務器上執行爲複製建立的存儲過程。
    11.AS :指定過程要執行的操做。
    12.sql_statement :過程當中要包含的任意數目和類型的 Transact-SQL 語句。sql


3、存儲過程的控制語句
1.條件語句
    1) if-then -else語句
    CREATE PROCEDURE proc2(IN parameter int)  
    begin 
        declare var int;  
        set var=parameter+1;  
        if var=0 then 
            insert into t values(17);  
        end if;  
        if parameter=0 then 
            update t set s1=s1+1;  
        else 
            update t set s1=s1+2;  
        end if;  
    end;  數據庫

    2) case語句
    REATE PROCEDURE proc3 (in parameter int)  
    begin 
        declare var int;  
        set var=parameter+1;  
        case var  
        when 0 then   
            insert into t values(17);  
        when 1 then   
            insert into t values(18);  
        else   
            insert into t values(19);  
        end case;  
    end; 後端

2.循環語句
    1) while ···· end while
    CREATE PROCEDURE proc4()  
    begin 
        declare var int;  
        set var=0;  
        while var<6 do  
            insert into t values(var);  
            set var=var+1;  
        end while;  
    end;  緩存

    2) repeat···· end repeat
    CREATE PROCEDURE proc5 ()  
    begin   
        declare v int;  
        set v=0;  
        repeat  
            insert into t values(v);  
            set v=v+1;  
        until v>=5  
        end repeat;  
    end;      服務器

    3) loop ·····end loop
    CREATE PROCEDURE proc6 ()  
    begin 
        declare v int;  
        set v=0;  
        LOOP_LABLE:loop  
            insert into t values(v);  
            set v=v+1;  
            if v >=5 then 
                leave LOOP_LABLE;  
            end if;  
        end loop;  
    end;  函數

    4) 迭代:
    CREATE PROCEDURE proc10 ()  
    begin 
        declare v int;  
        set v=0;  
        LOOP_LABLE:loop  
            if v=3 then   
                set v=v+1;  
                ITERATE LOOP_LABLE;  
            end if;  
                insert into t values(v);  
                set v=v+1;  
            if v>=5 then 
                leave LOOP_LABLE;  
            end if;  
        end loop;  
    end;  oop

4、基本函數
    一、字符串類
    --CHARSET(str) //返回字串字符集
    --CONCAT (string2 [,... ]) //鏈接字串
    --INSTR (string ,substring ) //返回substring首次在string中出現的位置,不存在返回0
    --LCASE (string2 ) //轉換成小寫
    --LEFT (string2 ,length ) //從string2中的左邊起取length個字符
    --LENGTH (string ) //string長度
    --LOAD_FILE (file_name ) //從文件讀取內容
    --LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定開始位置
    --LPAD (string2 ,length ,pad ) //重複用pad加在string開頭,直到字串長度爲length
    --LTRIM (string2 ) //去除前端空格
    --REPEAT (string2 ,count ) //重複count次
    --REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替換search_str
    --RPAD (string2 ,length ,pad) //在str後用pad補充,直到長度爲length
    --RTRIM (string2 ) //去除後端空格
    --STRCMP (string1 ,string2 ) //逐字符比較兩字串大小,
    --SUBSTRING (str , position [,length ]) //從str的position開始,取length個字符,
    注:mysql中處理字符串時,默認第一個字符下標爲1,即參數position必須大於等於1 
    --TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符
    --UCASE (string2 ) //轉換成大寫
    --RIGHT(string2,length) //取string2最後length個字符
    --SPACE(count) //生成count個空格編碼

    二、數學類     --ABS (number2 ) //絕對值     --BIN (decimal_number ) //十進制轉二進制     --CEILING (number2 ) //向上取整     --CONV(number2,from_base,to_base) //進制轉換     --FLOOR (number2 ) //向下取整     --FORMAT (number,decimal_places ) //保留小數位數     --HEX (DecimalNumber ) //轉十六進制     注:HEX()中可傳入字符串,則返回其ASC-11碼,如HEX('DEF')返回4142143     也能夠傳入十進制整數,返回其十六進制編碼,如HEX(25)返回19     --LEAST (number , number2 [,..]) //求最小值     --MOD (numerator ,denominator ) //求餘     --POWER (number ,power ) //求指數     --RAND([seed]) //隨機數     --ROUND (number [,decimals ]) //四捨五入,decimals爲小數位數]     --SQRT(number2) //開平方          3).日期時間類     --ADDTIME (date2 ,time_interval ) //將time_interval加到date2     --CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //轉換時區     --CURRENT_DATE ( ) //當前日期     --CURRENT_TIME ( ) //當前時間     --CURRENT_TIMESTAMP ( ) //當前時間戳     --DATE (datetime ) //返回datetime的日期部分     --DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或時間     --DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式顯示datetime     --DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上減去一個時間     --DATEDIFF (date1 ,date2 ) //兩個日期差     --DAY (date ) //返回日期的天     --DAYNAME (date ) //英文星期     --DAYOFWEEK (date ) //星期(1-7) ,1爲星期天     --DAYOFYEAR (date ) //一年中的第幾天     --EXTRACT (interval_name FROM date ) //從date中提取日期的指定部分     --MAKEDATE (year ,day ) //給出年及年中的第幾天,生成日期串     --MAKETIME (hour ,minute ,second ) //生成時間串     --MONTHNAME (date ) //英文月份名     --NOW ( ) //當前時間     --SEC_TO_TIME (seconds ) //秒數轉成時間     --STR_TO_DATE (string ,format ) //字串轉成時間,以format格式顯示     --TIMEDIFF (datetime1 ,datetime2 ) //兩個時間差     --TIME_TO_SEC (time ) //時間轉秒數]     --WEEK (date_time [,start_of_week ]) //第幾周     --YEAR (datetime ) //年份     --DAYOFMONTH(datetime) //月的第幾天     --HOUR(datetime) //小時     --LAST_DAY(date) //date的月的最後日期     --MICROSECOND(datetime) //微秒     --MONTH(datetime) //月     --MINUTE(datetime) //分返回符號,正負或0     

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息