1. 程式人生 > 其它 >AI智慧安防視訊EasyCVR平臺接入國標硬體裝置播放視訊失敗的原因排查與分析

AI智慧安防視訊EasyCVR平臺接入國標硬體裝置播放視訊失敗的原因排查與分析

MYSQL 儲存過程

儲存過程(Stored Procedure):在資料庫中儲存複雜程式,以便外部程式呼叫的一種資料庫物件。

優點:

  • 儲存過程可封裝,並隱藏複雜的商業邏輯。
  • 儲存過程可以回傳值,並可以接受引數。
  • 儲存過程無法使用 SELECT 指令來執行,因為它是子程式,與查看錶,資料表或使用者定義函式不同。
  • 儲存過程可以用在資料檢驗,強制實行商業邏輯等。

缺點:

  • 儲存過程,往往定製化於特定的資料庫上,因為支援的程式語言不同。當切換到其他廠商的資料庫系統時,需要重寫原有的儲存過程。
  • 儲存過程的效能調校與撰寫,受限於各種資料庫系統。

1. 儲存過程的建立與呼叫

  • 儲存過程就是具有名字的一段程式碼,用來完成一個特定的功能。
  • 建立的儲存過程儲存在資料庫的資料字典中。
/**
	宣告語句結束符,可以自定義
**/
DELIMITER $$ 或 DELIMITER //
    
/**
	宣告儲存過程
**/
CREATE PROCEDURE demo_in_parameter(IN p_in int) 
    
/**
	儲存過程開始和結束符號
**/
BEGIN .... END
    
/**
	變數賦值
**/
SET @p_in=1
    
/**
	變數定義
**/
DECLARE l_int int unsigned default 4000000;

/**
	建立mysql儲存過程、儲存函式
**/
create procedure 儲存過程名(引數)
    
/**
	儲存過程體
**/
create function 儲存函式名(引數)

完整DEMO

mysql> delimiter $$  #將語句的結束符號從分號;臨時改為兩個$$(可以是自定義)
mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)
    -> BEGIN
    ->   DELETE FROM MATCHES
    ->    WHERE playerno = p_playerno;
    -> END$$
Query OK, 0 rows affected (0.01 sec)
 
mysql> delimiter;  #將語句的結束符號恢復為分號

注意點:預設情況下,儲存過程和預設資料庫相關聯,如果想指定儲存過程建立在某個特定的資料庫下,那麼在過程名前面加資料庫名做字首。

儲存過程體:

  • 儲存過程體包含了在過程呼叫時必須執行的語句,例如:dml、ddl語句,if-then-else和while-do語句、宣告變數的declare語句等
  • 過程體格式:以begin開始,以end結束(可巢狀)
label1: BEGIN
  label2: BEGIN
    label3: BEGIN
      statements; 
    END label3 ;
  END label2;
END label1

標籤有兩個作用:

  • 1、增強程式碼的可讀性
  • 2、在某些語句(例如:leave和iterate語句),需要用到標籤

2. 儲存過程的引數

CREATE PROCEDURE 儲存過程名([[IN |OUT |INOUT ] 引數名 資料類形...])
  • IN 輸入引數:表示呼叫者向過程傳入值(傳入值可以是字面量或變數)
  • OUT 輸出引數:表示過程向呼叫者傳出值(可以返回多個值)(傳出值只能是變數)
  • INOUT 輸入輸出引數:既表示呼叫者向過程傳入值,又表示過程向呼叫者傳出值(值只能是變數)

注意點:

1、如果過程沒有引數,也必須在過程名後面寫上小括號:

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) ……

2、確保引數的名字不等於列的名字,否則在過程體中,引數名被當做列名來處理

建議:

  • 輸入值使用in引數。
  • 返回值使用out引數。
  • inout引數就儘量的少用。

3. 變數

3.1 變數定義

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];


// 舉例
DECLARE l_int int unsigned default 4000000;  
DECLARE l_numeric number(8,2) DEFAULT 9.95;  
DECLARE l_date date DEFAULT '1999-12-31';  
DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';  
DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';

3.2 變數賦值

SET 變數名 = 表示式值 [,variable_name = expression ...]

3.3 使用者變數

mysql > SELECT 'Hello World' into @x;  
mysql > SELECT @x;  
+-------------+  
|   @x        |  
+-------------+  
| Hello World |  
+-------------+  
mysql > SET @y='Goodbye Cruel World';  
mysql > SELECT @y;  
+---------------------+  
|     @y              |  
+---------------------+  
| Goodbye Cruel World |  
+---------------------+  
 
mysql > SET @z=1+2+3;  
mysql > SELECT @z;  
+------+  
| @z   |  
+------+  
|  6   |  
+------+

注意點:

  • 1、使用者變數名一般以@開頭
  • 2、濫用使用者變數會導致程式難以理解及管理

4. 註釋

  • 單行註釋:--
  • 多行註釋:C風格
  1. 查詢儲存過程
selectname from mysql.proc where db='資料庫名';


selectroutine_name from information_schema.routines where routine_schema='資料庫名';


showprocedure status where db='資料庫名';
  1. 查詢儲存過程詳細資訊
SHOWCREATE PROCEDURE 資料庫.儲存過程名;
  1. 修改儲存過程
ALTER PROCEDURE
  1. 刪除儲存過程
DROP PROCEDURE

引用:

https://www.runoob.com/w3cnote/mysql-stored-procedure.html