1. 程式人生 > 其它 >53. 最大子序和(python3)

53. 最大子序和(python3)

目錄

儲存過程

簡介

是一組為了完成特定功能的SQL語句集合

比傳統SQL速度更快、執行效率更高

儲存過程的優點

  • 執行一次後,會將生成的二進位制程式碼駐留緩衝區,提高執行效率
  • SQL語句加上控制語句的集合,靈活性高
  • 在伺服器端儲存,客戶端呼叫時,降低網路負載
  • 可多次重複被呼叫,可隨時修改,不影響客戶端呼叫
  • 可完成所有的資料庫操作,也可控制資料庫的資訊訪問許可權

:要建立儲存過程,必須要具有CREATE ROUTINE許可權。

儲存過程的優點

  1. 儲存過程執行一次後,生成的二進位制程式碼就駐留在緩衝區,之後如果再次呼叫的話,將直接呼叫二進位制程式碼,使得儲存過程的執行效率和效能得到大幅提升。
  2. 儲存過程是SQL語句加上控制語句的集合,有很強的靈活性,可以完成複雜的運算。
  3. 儲存過程儲存在伺服器端,客戶端呼叫時,直接在伺服器端執行,客戶端只是傳輸的調﹑用語句,從而可以降低網路負載。
  4. 儲存過程被建立後,可以多次重複呼叫,它將多條SQL封裝到了一起,可隨時針對SQL.語句進行修改,不影響呼叫它的客戶端。
  5. 儲存過程可以完成所有的資料庫操作,也可以通過程式設計的方式控制資料庫的資訊訪問許可權。

建立儲存過程

使用CREATE PROCEDURE語句建立儲存過程

建立儲存過程的語法結構

CREATE PROCEDURE<過程名>([過程引數[....]])<過程體>   //儘量避免與內建的函式或欄位重名
[過程引數[....]]格式
[IN|OUT|INOUT ]<引數名><型別>

引數分為

  • 輸入引數:IN
  • 輸出引數:OUT
  • 輸入/輸出引數: INOUT

儲存過程的主體部分,被稱為過程體

BEGIN開始,以END結束,若只有一條SQL語句,則可以省略BEGIN-END

DELIMITER開始和結束

mysql> DELIMITER$$  //$$是使用者自定義的結束符
//省略儲存過程其他步驟
mysql> DELIMITER ;  //分號前有空格

示例:建立儲存過程

修改結束符

mysql> delimiter //

mysql> show databases //
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| auth               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
//:成為結束符

在這裡插入圖片描述

不帶引數的儲存過程

mysql> use aaa;
Database changed
mysql> delimiter //
mysql> create procedure c2()
    -> begin
    -> create table t5(name varchar(64),score int(3));
    -> insert into t5 values('zhangsan',70),('lisi',80);
    -> select * from t5;
    -> end //  
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call c2();
+----------+-------+
| name     | score |
+----------+-------+
| zhangsan |    70 |
| lisi     |    80 |
+----------+-------+
2 rows in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

在這裡插入圖片描述

帶引數的儲存過程

mysql> delimiter $$
mysql> use aaa $$
Database changed
mysql> create procedure getscore(IN a varchar(64))
    -> begin
    -> select * from t5 where name=a;
    -> end $$
Query OK, 0 rows affected (0.00 sec)

mysql> call getscore('zhangsan');
+----------+-------+
| name     | score |
+----------+-------+
| zhangsan |    70 |
+----------+-------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

在這裡插入圖片描述

修改儲存過程

儲存過程的修改分為特徵修改和內容修改
特徵修改的方法

ALTER PROCEDURE<過程名>[<特徵>...]

內容修改可先刪除原有儲存過程,之後再建立的方法

示例:修改儲存過程

刪除儲存體

mysql> drop procedure c2;
Query OK, 0 rows affected (0.00 sec)

mysql> call c2();
ERROR 1305 (42000): PROCEDURE aaa.c2 does not exist  //查詢無果,因c2被刪除

在這裡插入圖片描述

專案:in、out、inout區別

mysql> use aaa;
Database changed
mysql> set @num1=1,@num2=2,@num3=3;
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter $$
mysql> create procedure p(in num1 int,out num2 int,inout num3 int)
    -> begin
    -> select num1,num2,num3;
    -> set num1=10,num2=20,num3=30;
    -> end $$
Query OK, 0 rows affected (0.00 sec)


mysql> delimiter ;
mysql> call p(@num1,@num2,@num3);
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
|    1 | NULL |    3 |
+------+------+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select @num1,@num2,@num3;
+-------+-------+-------+
| @num1 | @num2 | @num3 |
+-------+-------+-------+
|     1 |    20 |    30 |
+-------+-------+-------+
1 row in set (0.00 sec)

在這裡插入圖片描述

總結

  • in和inout引數會將全域性變數的值傳入儲存過程中,而out引數不會將全域性變數的值傳入儲存過程中。在儲存過程使用中,引數值in、out、inout都會發生改變。
  • 呼叫完儲存過程後,發現in引數不會對全域性變數的值引起變化,而out和inout引數呼叫完儲存過程後,會對全域性變數的值產生變化,會將儲存過程引用後的值賦值給全域性變數。
  • in引數賦值型別可以是變數還有定值,而out和inout引數賦值型別必須是變數。