MySQL - CALL 語句



MySQL CALL 語句

儲存過程是子例程,儲存在 SQL 目錄中的 SQL 語句片段。這些過程包含輸入和輸出引數,或兩者兼有。如果使用 SELECT 語句,它們可能會返回結果集;它們可以返回多個結果集。

MySQL 的 CALL 語句用於呼叫儲存過程。

語法

以下是 MySQL 中 CALL 語句的語法:

CALL procedure_name(parameter[param1, param2, ...])

其中 procedure_name 是您需要呼叫的現有過程的名稱,param1 和 param2... 是過程接受的引數列表(如果它接受任何引數)。

呼叫帶引數的儲存過程

假設我們已經使用 CREATE 語句在資料庫中建立了一個名為 Emp 的表,並在其中插入了三條記錄,如下所示:

CREATE TABLE Emp (
   Name VARCHAR(255), 
   Salary INT, 
   Location VARCHAR(255)
);

假設我們已經建立了一個名為 InsertData 的儲存過程,它接受名稱、薪水和位置值,並將它們作為記錄插入到上面建立的 (Emp) 表中。

DELIMITER //
Create procedure InsertData (
   IN name VARCHAR(30),
   IN sal INT,
   IN loc VARCHAR(45))
      BEGIN
         INSERT INTO Emp(Name, Salary, Location) VALUES (name, sal, loc);
      END //
DELIMITER ;

以下語句呼叫上面建立的儲存過程

CALL InsertData ('Raju', 35000, 'Bangalore');
CALL InsertData ('Raman', 45000, 'Vishakhapatnam'); 
CALL InsertData ('Rahman', 55000, 'Hyderabad');

驗證

透過傳遞所需的值呼叫過程後,您可以驗證 Emp 表的內容,如下所示:

SELECT * FROM EMP;

以上查詢產生以下輸出:

姓名 薪水 地點
Raju 35000 Bangalore
Raman 45000 Visakhapatnam
Rahman 55000 Hyderabad

呼叫不帶引數的儲存過程

呼叫不接受任何引數的儲存過程時,可以省略括號,如下所示:

CALL procedure;

假設我們建立了另一個名為 getData 的過程,它重試 EMP 表的內容:

DELIMITER //
CREATE PROCEDURE getData()
   BEGIN
      SELECT * FROM EMP;
   END//
DELIMITER ;

由於此過程不接受引數,因此您可以透過省略引數來呼叫此過程,如下所示:

CALL getData;

輸出

以下是上述查詢的輸出:

姓名 薪水 地點
Raju 35000 Bangalore
Raman 45000 Visakhapatnam
Rahman 55000 Hyderabad

呼叫返回值的儲存過程

讓我們使用 CREATE 語句在 MySQL 資料庫中建立另一個名為 Sales 的表,如下所示:

CREATE TABLE sales(
   ID INT,
   ProductName VARCHAR(255),
   CustomerName VARCHAR(255),
   DispatchDate date,
   DeliveryTime time,
   Price INT,
   Location VARCHAR(255)
);

現在,我們將使用 INSERT 語句在 Sales 表中插入 5 條記錄:

Insert into sales values
(1, 'Key-Board', 'Raja', DATE('2019-09-01'), 
TIME('11:00:00'), 7000, 'Hyderabad'),
(2, 'Earphones', 'Roja', DATE('2019-05-01'), 
TIME('11:00:00'), 2000, 'Vishakhapatnam'),
(3, 'Mouse', 'Puja', DATE('2019-03-01'), 
TIME('10:59:59'), 3000, 'Vijayawada'),
(4, 'Mobile', 'Vanaja', DATE('2019-03-01'), 
TIME('10:10:52'), 9000, 'Chennai'),
(5, 'Headset', 'Jalaja', DATE('2019-04-06'), 
TIME('11:08:59'), 6000, 'Goa'),

我們在資料庫中建立了一個名為 getProductPrice 的儲存過程,如下所示:

DELIMITER //
CREATE PROCEDURE getPrice (
   IN in_id INTEGER,
   OUT out_ProdName VARCHAR(20),
   OUT out_CustName VARCHAR(20),
   OUT out_price INTEGER)
   BEGIN
      SELECT ProductName, CustomerName, Price
      INTO out_ProdName, out_CustName, out_price
      FROM Sales where id = in_id;
   END //
DELIMITER ;

此過程接受客戶 ID 作為輸入引數,並從 sales 表中返回產品名稱(字串)、客戶名稱(字串)和價格(整數)值作為輸出引數。

要呼叫帶引數的過程,請將 @parameter_name 作為引數傳遞,在這些引數中儲存輸出值。

CALL getPrice (1, @ProductName, @CustomerName, @Price);

稍後您可以列印 mysql 引數的值,如下所示:

SELECT @ProductName, @CustomerName, @Price;

輸出

上面的 mysql 查詢將生成以下輸出:

@ProductName @CustomerName @Price
鍵盤 Raja 7000
廣告