53. 最大子序和(python3)
阿新 • • 發佈:2020-12-26
目錄
儲存過程
簡介
是一組為了完成特定功能的SQL語句集合
比傳統SQL速度更快、執行效率更高
儲存過程的優點
- 執行一次後,會將生成的二進位制程式碼駐留緩衝區,提高執行效率
- SQL語句加上控制語句的集合,靈活性高
- 在伺服器端儲存,客戶端呼叫時,降低網路負載
- 可多次重複被呼叫,可隨時修改,不影響客戶端呼叫
- 可完成所有的資料庫操作,也可控制資料庫的資訊訪問許可權
注:要建立儲存過程,必須要具有CREATE ROUTINE許可權。
儲存過程的優點
- 儲存過程執行一次後,生成的二進位制程式碼就駐留在緩衝區,之後如果再次呼叫的話,將直接呼叫二進位制程式碼,使得儲存過程的執行效率和效能得到大幅提升。
- 儲存過程是SQL語句加上控制語句的集合,有很強的靈活性,可以完成複雜的運算。
- 儲存過程儲存在伺服器端,客戶端呼叫時,直接在伺服器端執行,客戶端只是傳輸的調﹑用語句,從而可以降低網路負載。
- 儲存過程被建立後,可以多次重複呼叫,它將多條SQL封裝到了一起,可隨時針對SQL.語句進行修改,不影響呼叫它的客戶端。
- 儲存過程可以完成所有的資料庫操作,也可以通過程式設計的方式控制資料庫的資訊訪問許可權。
建立儲存過程
使用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引數賦值型別必須是變數。