久综合色-久综合网-玖草影视-玖草资源在线-亚洲黄色片子-亚洲黄色片在线观看

Hello! 歡迎來到小浪云!


如何在 MySQL 中使用存儲過程


avatar
小浪云 2025-01-15 109

通常,在使用關系數據庫時,您可以直接從應用程序代碼中發出單獨的結構化查詢語言 (sql) 查詢來檢索或操作數據,例如 select、INSERT、UPDATE 或 delete。這些語句直接作用于并操作底層數據庫表。如果在訪問同一數據庫的多個應用程序中使用相同的語句或語句組,則它們通常會在各個應用程序中重復。

如何在 MySQL 中使用存儲過程

mysql,與許多其他關系數據庫管理系統類似, 支持使用存儲過程。存儲過程幫助第一組 或多個 SQL 語句以通用名稱重用,封裝 數據庫本身內的通用業務邏輯。這樣的程序可以 從訪問數據庫的應用程序調用以檢索或 以一致的方式操作數據。

使用存儲過程,您可以為常見的情況創建可重用的例程 跨多個應用程序使用的任務,提供數據驗證, 或者通過限制來提供額外的數據訪問安全層 數據庫用戶直接訪問底層表并發出 任意查詢。

在本教程中,您將了解什么是存儲過程以及如何 創建返回數據并使用輸入和數據的基本存儲過程 輸出參數。

連接到 MySQL 并設置示例數據庫

在本節中,您將連接到 MySQL 服務器并創建一個 示例數據庫,以便您可以按照本指南中的示例進行操作。

在本指南中,您將使用一個虛構的汽車集合。您將存儲 有關當前擁有的汽車的詳細信息,包括其品牌、型號、制造年份,

如果您的 SQL 數據庫系統在遠程服務器上運行,請從本地計算機 ssh 到您的服務器:

ssh sammy@your_server_ip

然后打開 MySQL 服務器提示,將sammy替換為您的 MySQL 用戶名account:

mysql -u sammy-p

創建一個名為procedures的數據庫:

CREATE DATABASEprocedures;

如果數據庫創建成功,您將收到如下輸出:

OutputQuery OK, 1 row affected (0.01 sec)

選擇程序數據庫,運行以下 USE 語句:

USEprocedures;

您將收到以下輸出:

OutputDatabase changed

選擇數據庫后,您可以創建示例其中的表格。表 cars 將包含有關數據庫中汽車的簡化數據。它將包含以下列:

  • 品牌:此列包含每輛擁有的汽車的品牌,使用最多 100 個字符的 varchar 數據類型表示。
  • 型號:此列保存汽車型號名稱,使用 varchar 數據類型表示,最多 100 個字符。
  • 年份:此列存儲汽車的構建年,采用 int 數據類型來保存數值。
  • value:該列使用十進制數據類型存儲汽車的值,最多 10 位數字,小數點后 2 位數字。

使用以下命令創建示例表:

CREATE TABLE cars (    make varchar(100),    model varchar(100),    year int,    value decimal(10, 2));

如果輸出如下打印后,表已創建:

OutputQuery OK, 0 rows affected (0.00 sec)

接下來,通過運行以下 INSERT INTO 操作向 cars 表加載一些示例數據:

INSERT INTO carsVALUES('Porsche', '911 GT3', 2020, 169700),('Porsche', 'Cayman GT4', 2018, 118000),('Porsche', 'Panamera', 2022, 113200),('Porsche', 'Macan', 2019, 27400),('Porsche', '718 Boxster', 2017, 48880),('Ferrari', '488 GTB', 2015, 254750),('Ferrari', 'F8 Tributo', 2019, 375000),('Ferrari', 'SF90 Stradale', 2020, 627000),('Ferrari', '812 Superfast', 2017, 335300),('Ferrari', 'GTC4Lusso', 2016, 268000);

插入 該行動將在表中添加十輛樣品跑車,其中五輛 保時捷和五款法拉利車型。以下輸出表明所有 添加了五行:

OutputQuery OK, 10 rows affected (0.00 sec) Records: 10  Duplicates: 0  Warnings: 0

至此,您就可以按照指南的其余部分進行操作并開始在 SQL 中使用存儲過程。

存儲過程簡介

MySQL 和許多其他關系數據庫中的存儲過程 系統是包含一個或多個布局指令的命名對象 然后在調用時由數據庫按順序執行。在 最基本的例子,存儲過程可以保存一個通用的語句 可重用的例程,例如從數據庫中檢索數據 經常使用的過濾器。例如,您可以創建一個存儲過程來 檢索在最后給定時間內下訂單的在線商店客戶 月數。在最復雜的場景中,存儲過程可以 代表描述復雜業務邏輯的廣泛程序 健壯的應用程序。

存儲過程中的指令集可以包括返回或操作數據的常見 SQL 語句,例如 SELECT 或 INSERT 查詢。此外,存儲過程可以利用:

  • 傳遞給存儲過程或通過存儲過程返回的參數。
  • 聲明的變量以直接在過程代碼中處理檢索到的數據。
  • 條件語句,允許執行部分內容 存儲過程代碼取決于某些條件,例如 if 或 CASE 指令。
  • 循環,例如 while、LOOP 和 REPEAT,允許多次執行部分代碼,例如針對檢索到的數據中的每一行執行
  • 錯誤處理指令,例如向訪問該過程的數據庫用戶返回錯誤消息。
  • 調用其他存儲過程數據庫。

當通過名稱調用過程時,數據庫引擎按照定義逐條指令執行它。

數據庫用戶必須具有適當的執行權限 給定的程序。此權限要求提供了一層 安全性,禁止直接數據庫訪問,同時授予用戶訪問權限 保證安全執行的各個過程。

存儲過程直接在數據庫服務器上執行, 在本地執行所有計算并將結果返回給調用者 僅當完成時才使用。

如果您想更改過程行為,您可以更新 數據庫中的過程,以及正在使用它的應用程序 自動選擇新版本。所有用戶將立即開始 使用新的程序代碼而不需要調整它們

以下是用于創建存儲過程的 SQL 代碼的一般結構:

DELIMITER //CREATE PROCEDURE procedure_name(parameter_1, parameter_2, . . ., parameter_n)BEGIN    instruction_1;    instruction_2;    . . .    instruction_n;END //DELIMITER ;

此代碼片段中的第一個和最后一個指令是 DELIMITER // 和分隔符 ;.通常,MySQL使用分號符號(;) 分隔語句并指示它們何時開始和結束。如果你 在 MySQL 控制臺中執行多個語句,用 分隔 分號,它們將被視為單獨的命令并執行 各自獨立,一個接一個。然而,存儲過程可以 包含多個命令,這些命令將在執行時按順序執行 被叫。當試圖告訴 MySQL 創建 一個新的程序。數據庫引擎會遇到分號 在存儲過程主體中并認為它應該停止執行 陳述。在這種情況下,預期的陳述是整個 過程創建代碼,而不是過程中的單個指令

要解決此限制,您可以使用 DELIMITER 命令暫時將分隔符從 ; 更改為 ; 本身,因此 MySQL 會誤解您的意圖。 // 在 CREATE PROCEDURE 期間 稱呼。然后,存儲過程主體內的所有分號都將是 按原樣傳遞到服務器。整個程序完成后, 分隔符改回 ;最后一個 DELIMITER ;.

創建新過程的代碼的核心是 CREATE PROCEDURE 調用,后跟過程名稱: procedure_name 在示例中。過程名稱后面跟著一個可選的列表 過程將接受的參數。最后一部分是程序 正文,包含在 BEGIN 和 END 語句中。里面是過程代碼,其中可以包含單個 SQL 語句,例如 SELECT 查詢或更復雜的代碼。

END 命令以臨時分隔符 // 結尾,而不是典型的分號。

在下一節中,您將創建一個不包含單個查詢的參數的基本存儲過程。

創建一個不帶參數的存儲過程參數

在本節中,您將創建第一個存儲過程,該存儲過程封裝單個 SQL SELECT 語句,以返回按品牌和價值降序排列的自有汽車列表。

開始于執行您要使用的 SELECT 語句:

SELECT * FROM cars ORDER BY make, value DESC;

數據庫將返回來自以下位置的汽車列表汽車表,首先按品牌排序,然后在單個品牌內按價值降序排列

Output --------- --------------- ------ -----------  | make    | model         | year | value     |  --------- --------------- ------ -----------  | Ferrari | SF90 Stradale | 2020 | 627000.00 | | Ferrari | F8 Tributo    | 2019 | 375000.00 | | Ferrari | 812 Superfast | 2017 | 335300.00 | | Ferrari | GTC4Lusso     | 2016 | 268000.00 | | Ferrari | 488 GTB       | 2015 | 254750.00 | | Porsche | 911 GT3       | 2020 | 169700.00 | | Porsche | Cayman GT4    | 2018 | 118000.00 | | Porsche | Panamera      | 2022 | 113200.00 | | Porsche | 718 Boxster   | 2017 |  48880.00 | | Porsche | Macan         | 2019 |  27400.00 |  --------- --------------- ------ -----------  10 rows in set (0.00 sec)

最有價值的法拉利位于列表頂部,最不值錢的保時捷出現在

假設此查詢將在多個應用程序中頻繁使用或 由多個用戶使用,并假設您希望確保每個人都會使用 對結果進行排序的方式完全相同。為此,您想要創建一個 存儲過程將該語句保存在可重用的名為 procedure.

要創建此存儲過程,請執行以下代碼片段:

DELIMITER //CREATE PROCEDUREget_all_cars()BEGIN    SELECT * FROM cars ORDER BY make, value DESC;END //DELIMITER ;

如上一節所述,第一個和最后一個命令 (DELIMITER / / 和 DELIMITER ;) 告訴 MySQL 在過程期間停止將分號字符視為語句分隔符創建。

CREATE PROCEDURE SQL 命令后跟過程名稱get_all_cars,您可以定義它來最好地描述過程的作用。過程名稱后面有一對括號() 您可以在其中添加參數。在此示例中,該過程不 使用參數,因此括號為空。然后,在定義過程代碼塊的開始和結束的 BEGIN 和 END 命令之間,逐字寫入之前使用的 SELECT 語句。

數據庫將返回一條成功消息:

OutputQuery OK, 0 rows affected (0.02 sec)

get_all_cars過程現在保存在數據庫中,當調用時,它將執行保存的語句: is.

要執行保存的存儲過程,可以使用 CALL SQL 命令,后跟過程名稱。嘗試像這樣運行新創建的過程:

CALLget_all_cars;

過程名稱get_all_cars就是使用該過程所需的全部內容。您不再需要手動鍵入以前使用的 SELECT 語句的任何部分。數據庫將顯示結果,就像之前運行的 SELECT 語句的輸出一樣:

Output --------- --------------- ------ -----------  | make    | model         | year | value     |  --------- --------------- ------ -----------  | Ferrari | SF90 Stradale | 2020 | 627000.00 | | Ferrari | F8 Tributo    | 2019 | 375000.00 | | Ferrari | 812 Superfast | 2017 | 335300.00 | | Ferrari | GTC4Lusso     | 2016 | 268000.00 | | Ferrari | 488 GTB       | 2015 | 254750.00 | | Porsche | 911 GT3       | 2020 | 169700.00 | | Porsche | Cayman GT4    | 2018 | 118000.00 | | Porsche | Panamera      | 2022 | 113200.00 | | Porsche | 718 Boxster   | 2017 |  48880.00 | | Porsche | Macan         | 2019 |  27400.00 |  --------- --------------- ------ -----------  10 rows in set (0.00 sec)  Query OK, 0 rows affected (0.00 sec)

您現在已成功創建一個不帶任何參數的存儲過程,該存儲過程返回 cars 表中以特定方式訂購的所有汽車。您可以在多個應用程序中使用該過程。

在下一節中,您將創建一個接受 根據用戶輸入更改過程行為的參數。

相關閱讀

主站蜘蛛池模板: 亚洲视频男人的天堂 | 精品真实国产乱文在线 | 日本一区午夜爱爱 | 人与禽的免费一级毛片 | 亚洲国产日韩欧美 | 欧美一级专区免费大片 | 欧美日韩另类国产 | 欧美成人 综合网播九公社 欧美成人26uuu欧美毛片 | 久久这里一区二区精品 | 日本一线一区二区三区免费视频 | 啪啪一级片 | 成人免费视频日本 | 亚洲精品一区二区三区中文字幕 | 午夜性爽快免费视频播放 | 97在线看| 日韩永久在线观看免费视频 | 国产一区二区三区欧美 | 久在草| 91www成人久久 | 欧美一级特黄一片免费 | 亚洲欧美精品一区 | 亚洲视频三级 | aaaaaa精品视频在线观看 | 久久亚洲精品中文字幕二区 | 新久草视频 | 99国产高清久久久久久网站 | 美女视频黄.免费网址 | 精品国产欧美一区二区五十路 | 欧美日韩顶级毛片www免费看 | 国产精品视频一区二区猎奇 | 久久久久久久久久久久久久久久久 | 欧美满嘴射 | 亚洲理论片在线中文字幕 | 欧美三级欧美成人高清www | 一级黄免费 | 免费乱淫视频 | 久久成人国产 | 91精品国产免费久久国语蜜臀 | 综合 欧美 国产 视频二区 | 久久久久久亚洲精品中文字幕 | 国内自拍视频一区二区三区 |