實驗9 存儲過程與函數的創建管理實驗

一、實驗目的:

  1. 理解存儲過程和函數的概念。
  2. 掌握創建存儲過程和函數的方法。
  3. 掌握執行存儲過程和函數的方法。
  4. 掌握游標的定義、使用方法。

二、實驗內容

1.某超市的食品管理的數據庫的Food表,Food表的定義如表所示,
Food表的定義
在這里插入圖片描述
各列有如下數據:
‘QQ餅干’,‘QQ餅干廠’,2.5,‘2008’,3,‘北京’
‘MN牛奶’,‘MN牛奶廠’,3.5,‘2009’,1,‘河北’
‘EE果凍’,‘EE果凍廠’,1.5,‘2007’,2,‘北京’
‘FF咖啡’,‘FF咖啡廠’,20,‘2002’,5,‘天津’
‘GG奶糖’,‘GG奶糖’,14,‘2003’,3,‘廣東’

(1) 在food表上創建名為Pfood_price_count的存儲過程。其中存儲過程Pfood_price_count有3個參數。輸入參數為price_infol和price_info2,輸出參數為count。存儲過程的滿足:查詢food表中食品單價高于price_infol且低于price_info2的食品種數,然后由count參數來輸出,并且計算滿足條件的單價的總和。

DELIMITER //
CREATE PROCEDURE Pfood_price_count(IN price_infol FLOAT, IN price_info2 FLOAT, OUT count INT)
BEGINDECLARE sum_price FLOAT DEFAULT 0;SELECT COUNT(*), SUM(price) INTO count, sum_price FROM food WHERE price > price_infol AND price < price_info2;SELECT CONCAT('滿足條件的食品種數為:', count) AS result;SELECT CONCAT('滿足條件的單價總和為:', sum_price) AS result;
END //
DELIMITER ;

(2) 使用CALL語句來調用存儲過程。查詢價格在2至18之間的食品種數。代碼如下:

CALL Pfood_price_count(2, 18, @count);

(3)使用DROP語句刪除存儲過程Pfood_price_count。代碼如下:

DROP PROCEDURE Pfood_price_count; 

(4) 使用存儲函數來實現(1)的要求。

DELIMITER //
CREATE FUNCTION Ffood_price_count(price_infol FLOAT, price_info2 FLOAT) RETURNS VARCHAR(100) DETERMINISTIC READS SQL DATA
BEGINDECLARE count INT DEFAULT 0;DECLARE sum_price FLOAT DEFAULT 0;SELECT COUNT(*), SUM(price) INTO count, sum_price FROM food WHERE price > price_infol AND price < price_info2;RETURN CONCAT('滿足條件的食品種數為:', count, ',滿足條件的單價總和為:', sum_price);
END //
DELIMITER ;

(5)調用存儲函數

SELECT Ffood_price_count(2, 18) AS result;

(6)刪除存儲函數

DROP FUNCTION Ffood_price_count;

2.學校教師管理數據庫中的teacherInfo表,其表的定義如下表所示,請完成如下操作。
在這里插入圖片描述
向teacherInfo表中插入記錄:
1001,‘張龍’,‘男’,‘1984-11-08’,‘北京市昌平區’
1002,‘李梅’,‘女’,‘1970-01-21’,‘北京市海淀區’
1003,‘王一豐’,‘男’,‘1976-10-30’,‘北京市昌平區’
1004,‘趙六’,‘男’,‘1980-06-05’,‘北京市順義區’

(1)創建名為teachernfo1的存儲過程。要求:存儲過程teachernfo1有3個參數。輸入參數為teacherid和type,輸出參數為info。滿足:根據編號(teacherid)來查詢teachernfo表中的記錄。如果type的值為1時,將姓名(name)傳給輸出參數info;如果type的值為2時,將年齡傳給輸出參數info;如果type為其他值,則返回字符串“Error”。

DELIMITER //
CREATE PROCEDURE teachernfo1(IN teacherid INT, IN type INT, OUT info VARCHAR(50))
BEGINDECLARE name VARCHAR(20);DECLARE birthday DATETIME;DECLARE age INT;SELECT name, birthday INTO name, birthday FROM teacherInfo WHERE num = teacherid;SET age = YEAR(CURDATE()) - YEAR(birthday);IF type = 1 THENSET info = name;ELSEIF type = 2 THENSET info = age;ELSESET info = 'Error';END IF;
END //
DELIMITER ;

(2)調用存儲過程,參數值teacher id為2,type為1。

CALL teachernfo1(2, 1, @info);
SELECT @info;

(3)使用DROP PRODECURE語句來刪除存儲過程

DROP PROCEDURE teachernfo1;

(4)創建名為teacherinfo2的存儲函數。要求:存儲過程teacherinfo2有兩個參數:teacher id和type。滿足:根據編號(teacher id)來查詢teacher表中的記錄。如果type的值是1時,則返回姓名(name)值;如果type的值是2時,則返回年齡;如果type為其他值,則返回字符串“Error”。

DELIMITER //
CREATE FUNCTION teacherinfo2(teacherid INT, type INT) RETURNS VARCHAR(50)
BEGINDECLARE name VARCHAR(20);DECLARE birthday DATETIME;DECLARE age INT;SELECT name, birthday INTO name, birthday FROM teacherInfo WHERE num = teacherid;SET age = YEAR(CURDATE()) - YEAR(birthday);IF type = 1 THENRETURN name;ELSEIF type = 2 THENRETURN age;ELSERETURN 'Error';END IF;
END //
DELIMITER ;

(5)使用SELECT語句調用teacherinfo2存儲函數。

SELECT teacherinfo2(2, 1);

(6)使用DROP FUNCTION語句來刪除teacherinfo2存儲函數。

DROP FUNCTION teacherinfo2;

三、觀察與思考

(1) 什么時候適合通過創建存儲過程來實現?
mysql中適合通過創建存儲過程來實現的情況包括:執行復雜的數據庫操作,提高代碼重用性;封裝業務邏輯,簡化客戶端開發;減少網絡通信量,提升性能;實施細粒度的權限控制;確保事務的一致性和完整性。

(2) 功能相同的存儲過程和存儲函數的不同點有哪些?
mysql中存儲過程和存儲函數的主要不同點在于調用方式、返回值和語句類型。存儲過程可以執行復雜邏輯,支持輸出參數和多種sql語句類型,適合執行修改數據的操作。而存儲函數必須返回單個值,通常用于計算和返回數據,適用于select語句中,作為表達式的一部分。

(3)使用游標對于數據檢索的好處有哪些?
使用游標進行數據檢索的好處包括:可以逐行處理結果集中的數據,提供更細粒度的控制;適合復雜的數據處理邏輯,如多步驟計算或條件判斷;減少內存占用,尤其當處理大量數據時;提高代碼的靈活性和可讀性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44393.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44393.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【進階篇-Day8:JAVA中遞歸、異常的介紹】

目錄 1、遞歸的介紹和使用1.1 遞歸的介紹1.2 案例案例一&#xff1a;案例二&#xff1a;案例三&#xff1a;案例四&#xff1a; 1.3 總結 2、異常的介紹和使用2.1 異常的介紹&#xff1a;&#xff08;1&#xff09;能夠看懂異常&#xff08;2&#xff09;異常的體系接口和分類&…

Go語言map并發安全,互斥鎖和讀寫鎖誰更優?

并發編程是 Go 語言的一大特色&#xff0c;合理地使用鎖對于保證數據一致性和提高程序性能至關重要。 在處理并發控制時&#xff0c;sync.Mutex&#xff08;互斥鎖&#xff09;和 sync.RWMutex&#xff08;讀寫鎖&#xff09;是兩個常用的工具。理解它們各自的優劣及擅長的場景…

蘋果入局,AI手機或將實現“真智能”?

【潮汐商業評論/原創】 “AI應用智能手機不就是現在的AI手機。” 當被問到現階段對AI手機的看法時&#xff0c;John如是說。“術業有專攻&#xff0c;那么多APP在做AI功能&#xff0c;下載用就是了&#xff0c;也用不著現在換個AI手機啊。” 對于AI手機&#xff0c;或許大多…

上海市計算機學會競賽平臺2023年1月月賽丙組積木染色(二)

題目描述 &#x1d45b;n 塊積木排成一排&#xff0c;需要給每塊積木染色&#xff0c;顏色有 &#x1d45a;m 種。請問有多少種方法&#xff0c;從第二塊積木開始統計&#xff0c;恰有 &#x1d45d;p 塊積木與前一塊積木顏色不同&#xff1f; 輸入格式 三個整數分別表示 &a…

Windows安裝和使用Doccano標注工具

簡介 開源鏈接&#xff1a;GitHub - doccano/doccano: Open source annotation tool for machine learning practitioners. Open source annotation tool for machine learning practitioners. Doccano是一款開源的文本標注工具&#xff0c;由人工智能公司Hironsan開發并在G…

【算法】代碼隨想錄之數組

文章目錄 前言 一、二分查找法&#xff08;LeetCode--704&#xff09; 二、移除元素&#xff08;LeetCode--27&#xff09; 三、有序數組的平方&#xff08;LeetCode--977&#xff09; 四、長度最小的子數組&#xff08;LeetCode--209&#xff09; 五、螺旋矩陣II&#x…

花幾千上萬學習Java,真沒必要!(二)

1、注釋&#xff1a; java代碼注釋分3種&#xff1a; 單行注釋&#xff1a;//注釋信息 多行注釋: /*注釋信息*/ 文檔注釋:/**注釋信息*/ public class TestComments {// 這是單行注釋&#xff0c;用于注釋單行代碼或解釋代碼功能/* 這是多行注釋&#xff0c;用于注釋多行代碼…

Kotlin runCatching try-catch耗時比較

Kotlin runCatching try-catch耗時比較 fun main(args: Array<String>) {val lists arrayListOf("z")val idx 10/***納秒統計** ns&#xff08;nanosecond&#xff09;&#xff1a;納秒。一秒的10億分之一&#xff0c;10的-9次方秒。*   1納秒0.000001 毫秒…

基于實現Runnable接口的java多線程

Java多線程通常可以通過繼承Thread類或者實現Runnable接口實現。本文主要介紹實現Runnable接口的java多線程的方法, 并通過ThreadPoolTaskExecutor調用執行&#xff0c;以及應用場景。 一、應用場景 異步、并行、子任務、磁盤讀寫、數據庫查詢、網絡請求等耗時操作等。 以下…

筆記:在Entity Framework Core中如何處理多線程操作DbContext

一、目的&#xff1a; 在使用Entity Framework Core (EF Core) 進行多線程操作時&#xff0c;需要特別注意&#xff0c;因為DbContext類并不是線程安全的。這意味著&#xff0c;你不能從多個線程同時使用同一個DbContext實例進行操作。嘗試這樣做可能會導致數據損壞、異常或不可…

C語言排序之快速排序

快速排序是一種高效的排序算法。它采用了分治的策略&#xff0c;通過選擇一個基準元素&#xff0c;將待排序的序列劃分為兩部分&#xff0c;一部分的元素都比基準元素小&#xff0c;另一部分的元素都比基準元素大&#xff0c;然后對這兩部分分別進行快速排序&#xff0c;從而實…

前端開發工具

Lodash 有普通的 CommonJS 版本&#xff08;通常稱為 lodash&#xff09;和 ES6 模塊版本&#xff08;稱為 lodash-es&#xff09;。它們的主要區別包括&#xff1a; 模塊化&#xff1a;lodash 是傳統的 CommonJS 模塊&#xff0c;可使用 require 或 import 引入&#xff1b;lo…

2024年,搞AI就別卷模型了

你好&#xff0c;我是三橋君 2022年11月30日&#xff0c;OpenAI發布了一款全新的對話式通用人工智能工具——ChatGPT。 該工具發布后&#xff0c;僅用5天時間就吸引了100萬活躍用戶&#xff0c;而在短短2個月內&#xff0c;其活躍用戶數更是飆升至1億&#xff0c;成為歷史上增…

ARP協議介紹與ARP協議的攻擊手法

ARP是什么&#xff1f; ARP是通過網絡地址&#xff08;IP&#xff09;來定位機器MAC地址的協議&#xff0c;它通過解析網絡層地址&#xff08;IP&#xff09;來找尋數據鏈路層地址&#xff08;MAC&#xff09;的網絡傳輸協議。 對個定義不能理解的話&#xff0c;可以結合 TCP/I…

《戀與深空》2.0上線肉鴿模式,乙游玩家會買賬嗎?

乙游和肉鴿&#xff0c;看似八竿子打不著的兩個賽道&#xff0c;被疊紙給融合起來了。 根據《戀與深空》官方消息&#xff0c;即將在7月15日更新的2.0交錯視界版本中&#xff0c;會上線全新常駐玩法“混沌深網”&#xff0c;配置高隨機性Roguelike模式&#xff0c;并搭載了管理…

理想文檔發布了~一個集合了多個優秀開源項目的在線云文檔

兩年前我做了一個簡單的在線云文檔項目&#xff0c;選擇了開源的思維導圖、白板、流程圖、幻燈片等項目&#xff0c;在它們基礎上添加了云存儲的功能&#xff0c;然后寫了一個簡單的工作臺管理文件夾和文件&#xff1a; 放在了自己的個人網站上使用&#xff0c;同時寫了一篇水文…

【Leetcode 每日一題】349. 兩個數組的交集

給定兩個數組 nums1 和 nums2 &#xff0c;返回 它們的 交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序 。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 輸出&#xff1a;[2]示例 2&#xff1a; 輸入&#xff1a;nums…

[web]-代碼審計-運維失誤

打開頁面可以看到如下&#xff1a; 1、查看源代碼&#xff0c;發現驗證碼功能是正常生成的隨機的&#xff0c;輸入也沒有過濾&#xff0c;無法采用爆破。 2、根據題目提示運維失誤&#xff0c;使用dirsearch掃描&#xff0c;發現提交的地址check.php, 使用php5、.bak可以打開&…

2.The DispatcherServlet

The DispatcherServlet Spring的Web MVC框架與許多其他Web MVC框架一樣&#xff0c;是請求驅動的&#xff0c;圍繞一個中央Servlet&#xff08;即DispatcherServlet&#xff09;設計&#xff0c;該Servlet將請求分派給控制器&#xff0c;并提供其他功能以促進Web應用程序的開發…

創建I/O文件fopen

#include〈stdio.h〉 int mian(int argc,char *argv[]){ FILE *fp;//結構體fp fpfopen&#xff08;“1.txt”&#xff0c;“r”&#xff09;; }