1. 程式人生 > 程式設計 >php 檔案上傳至OSS及刪除遠端阿里雲OSS檔案

php 檔案上傳至OSS及刪除遠端阿里雲OSS檔案

一、基本介紹

儲存過程和函式是事先經過編譯並存儲在資料庫中的一段SQL語句的集合,減少資料在資料庫和應用服務之間的傳輸,對於提高資料處理的效率是有好處的。

儲存過程和函式的區別在於函式必須有返回值,而儲存過程沒有,儲存過程的引數可以使用IN、OUT、INOUT型別,而函式的引數只能是IN型別的。如果有函式從其他型別的資料庫遷移到MySQL,可能需要將函式改造成儲存過程。

儲存過程和函式允許包含DDL語句,也允許使用事務,還可以呼叫其他的儲存過程和函式,但不允許執行Load Data Infile語句;

二、相關操作

建立儲存過程或函式需要 CREATE ROUTINE 許可權,修改或刪除儲存過程或函式需要 ALTER ROUTINE 許可權,執行儲存過程或函式需要 EXECUTE 許可權。

建立、修改儲存過程或函式

Create procedure sp_name([proc_parameter[,…])

[characteristic…] routine_body

Create function sp_name([func_parameter[,…])

Returns type

[characteristic…] routine_body

Return xxx

呼叫語法:call sp_name([parameter[,…])

引數說明:

pro_parameter

    [ IN | OUT | INOUT ] param_name type

func_parameter

    param_name type

儲存過程和函式中不允許執行 LOAD DATA INFILE 語句。

Delimiter $$ 修改命令結束符

Characteristic特徵值:

    Language sql說明下面body是使用sql編寫,系統預設

    Sql security{ definer | invoker } 可以指定子程式該用建立子程式者的許可來執行還是使用呼叫者的許可權執行。預設是definer

    Comment‘string’ 儲存過程或函式的註釋資訊

    {Contains sql | no sql | reads sql data | modifies sql data

} 供子程式使用資料的內在資訊,目前只提供給伺服器,並沒有根據這些特徵值來約束過程實際使用資料的情況,預設是contains sql;

    1.   Contains sql 表示子程式不包含讀或寫資料的語句。
    2.   No sql 表示子程式不包含sql語句。
    3.   Reads sql data 表示子程式包含讀資料的語句,但不包含寫資料的語句。
    4.   Modifies sql data 表示子程式包含寫資料的語句。

  例項:

  

  返回值用 @xxx

  

  

  

刪除儲存過程或函式:

  一次只能刪除一個儲存過程或函式,需 ALTER ROUTINE 許可權

  Drop procedure name;

檢視儲存過程或者函式:

檢視儲存過程或函式的狀態:

  Show { procedure | function } status [like ‘pattern’];

  

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

  Show create { procedure | function } name;

  

通過檢視information_schema.Routines瞭解儲存過程和函式的資訊

  Select * from Routines where routine_name = “name”;

  

三、變數的使用

變數不區分大小寫

變數的定義

  Declare 定義一個區域性變數,作用域在 BEGIN … END 塊中,可以用在巢狀的塊中。必須寫在複合語句的開頭,並且在任何其他語句的前面。可一次宣告多個相同型別的變數。如需要,可以使用default賦預設值。

  Declare var_name[,…] type [default value];

變數的賦值

  變數可以直接賦值,或者通過查詢賦值。直接賦值使用set,可以賦常量或者賦表示式。

  Set var_name = expr [,var_name = expr] …

  Select col_name [,…] INTO var_name [,…] from xxx….; #查詢結果必須只有一行

  Set @a = xxx;相當於全域性變數

定義條件和處理:

處理過程中遇到問題時相應的處理步驟。

條件定義

  Declare condition_name CONDITION FOR condition_value

條件處理(遊標中有例項)

  Declare handler_type HANDLER FOR condition_value [,…] sp_statement

  說明:

  Handler_type目前支援continueexit,continue繼續執行下面的語句,exit表示終止。

  Condition_value值可以通過declare定義的 condition_name,可以是SQLSTATE的值或者mysql-error-code的值或SQLWARINGNOT FOUNDSQLEXECEPTION,這3個值是3種定義好的錯誤類別。

  1. SQLWARING 是對所有以01開頭的SQLSTATE程式碼速記
  2. NOT FOUND 是對所有以02開頭的SQLSTATE 程式碼速記
  3. SQLEXCEPTION 是對所有沒有被SQLWARING 或 NOT FOUND 捕獲的SQLSTATE 程式碼速記

  

四、遊標的使用

對結果集進行迴圈的處理,包括游標的宣告、open、fetch 和 close。

1條sql,對應N條結果集的資源,取出資源介面/控制代碼,就是遊標,沿著遊標,可以一次取出1行。好處是,每一行的處理權利在我們手中。

遊標通俗來講相當於你買東西別人一件件的給你,而不是一下子全給你。

執行沒有資料錯誤:

修改儲存過程:

BEGIN

DECLARE row_id int;
DECLARE row_dt varchar(50);
DECLARE row_catalog int;
DECLARE row_total int;
DECLARE i int default 1;
DECLARE getArticle CURSOR FOR select id,dt,catalog from tblarticle where catalog = 75;
select count(*) INTO row_total from tblarticle where catalog=75;

OPEN getArticle;

WHILE i<=row_total DO
    FETCH getArticle into row_id, row_dt, row_catalog;

    SELECT row_id, row_dt, row_catalog;
    set i = i+1;
END WHILE;
CLOSE getArticle;

END
BEGIN

DECLARE row_id int;
DECLARE row_dt varchar(50);
DECLARE row_catalog int;
DECLARE row_total int;
DECLARE i int DEFAULT 1;
DECLARE getArticle CURSOR FOR select id,dt,catalog from tblarticle where catalog = 75;
DECLARE EXIT HANDLER FOR NOT FOUND set i = 0;

OPEN getArticle;

REPEAT
    FETCH getArticle into row_id, row_dt, row_catalog;
    SELECT row_id, row_dt, row_catalog;
UNTIL i = 0 END REPEAT;

CLOSE getArticle;

END

Declare continue/exit handler for not found close 遊標名;

Continue 和 exit 的區別:

遊標迴圈讀取的正確邏輯:

五、流程控制

If 、case、loop、leave、iterate、repeat、while語句

If語句

  IF search_condition THEN statement_list

[ELSEIF search_condition THEN statement_list]…

[ELSE statement_list]

  END IF;

While語句

  WHILE search_condition Do

Statement_list

  END WHILE [end_label];

   

  

  

  

case語句

  

repeat語句(類似do…while

  

  

Whilerepeat的區別:

  While 是滿足條件才執行迴圈,repeat是滿足條件退出迴圈;

  While在首次迴圈執行之前就判斷條件,所以迴圈最少執行0次,而repeat是在首次執行迴圈之後才判斷條件,類似do…while,所以循壞最少執行1次;

分情破愛始亂棄,流落天涯思別離。 如花似玉負情意,影如白晝暗自迷。 隨風浮沉千葉落,行色匆匆鬢已稀。

轉自:https://www.cnblogs.com/cshaptx4869/p/10476692.html