MySQL存储过程与函数详解

需积分: 0 0 下载量 197 浏览量 更新于2024-08-05 收藏 568KB PDF 举报
"本章节主要介绍了MySQL中的存储过程与函数,由尚硅谷的宋红康讲师讲解。存储过程自MySQL 5.0版本起被支持,它们是预编译的一组SQL语句集合,便于封装复杂的逻辑,提高代码重用性和执行效率,同时减少网络传输和增强安全性。存储过程与视图类似,但能直接操作数据表,且没有返回值。存储过程根据参数类型(IN、OUT、INOUT)可分为五类。创建存储过程的语法类似于编程语言中的函数定义,包括IN、OUT和INOUT参数的用法。" 在MySQL中,存储过程扮演着重要的角色,它们允许开发者将复杂的SQL操作打包,形成可重复使用的代码段。这不仅简化了操作,还减少了程序员的工作负担,因为无需每次都需要编写相同的SQL语句。存储过程的一个显著优点是提高了效率,因为它只在首次创建时编译,后续调用只需执行已编译好的代码,减少了网络传输的数据量,同时也降低了SQL语句被恶意利用的风险。 存储过程与视图相比,虽然两者都能提供封装和安全性的提升,但视图是虚拟表,通常不直接修改底层数据,而存储过程则可以直接对数据进行增删改查等操作,因此在处理复杂逻辑时更为灵活。存储过程的调用类似于函数,但关键区别在于函数有返回值,而存储过程没有。 存储过程的参数类型决定了它们如何传递和接收数据。IN参数用于传递数据到存储过程内部,仅作为输入使用;OUT参数则在存储过程执行后返回结果,调用者可以获取其值;INOUT参数同时具备输入和输出功能,意味着过程内部可以改变该参数的值并返回。一个存储过程可以包含多个IN、OUT或INOUT参数,为实现各种功能提供了灵活性。 创建存储过程的语法类似于编程语言中的函数定义,包括指定参数名称、数据类型以及参数方向。例如,创建一个带有IN参数的存储过程,可以这样写: ```sql CREATE PROCEDURE procedure_name (IN param1 datatype) BEGIN -- SQL语句块 END; ``` 这里,`procedure_name`是存储过程的名称,`param1`是输入参数,`datatype`则是参数的数据类型。同样,可以添加OUT或INOUT参数来适应不同的需求。 存储过程是MySQL数据库中强大的工具,用于组织和优化SQL逻辑,提高代码复用性,减少网络负载,并提升数据安全性。理解和掌握存储过程的创建与使用对于数据库开发者来说至关重要。

对下面代码进行详细解释,解释每一行含义#include "common.h" #include "include.h" #include "dht11.h" uint16 vol[4]; uint8 dispCh = 0; uint8 humi_table1; int buffer[5]; void timer_init(uint16 ms) { pit_init_ms(PIT0, ms); //定时 1000 个bus时钟 后中断 set_vector_handler(PIT0_VECTORn, pit0_hander); // 设置中断复位函数到中断向量表里 enable_irq(PIT0_IRQn); } void KeyDown_Proc(uint8 key) { switch(key) { case 2: // up dispCh++; if(dispCh>3) dispCh=0; break; case 4: // down break; case 5: // enter break; case 11: break; case 12: break; case 8: break; case 9: break; default: break; } } void Key_Proc(void) { mKEY_MSG keyMsg; keyMsg = key_check(); switch(keyMsg.mstatus) { case mKEY_DOWN: KeyDown_Proc(keyMsg.value); printf("k_down = %d\r\n", keyMsg.value); break; case mKEY_HOLD: printf("k_hold = %d\r\n", keyMsg.value); break; default: break; } } void Sensor_init(void) { adc_init(ADC0, AD12); // ptb2 adc_init(ADC0, AD13); // ptb3 adc_init(ADC1, AD10); // ptb4 adc_init(ADC1, AD11); // ptb5 } #define STDVREF 3300 #define STDBIT ((1<<12)) void Sensor_Proc(void) { uint16 adVal; adVal = ad_mid(ADC0, AD12, ADC_12bit); vol[0] = STDVREF*adVal/STDBIT; adVal = ad_mid(ADC0, AD13, ADC_12bit); vol[1] = STDVREF*adVal/STDBIT; adVal = ad_mid(ADC1, AD10, ADC_12bit); vol[2] = STDVREF*adVal/STDBIT; adVal = ad_mid(ADC1, AD11, ADC_12bit); vol[3] = STDVREF*adVal/STDBIT; // printf("%d,%d,%d,%d\r\n", vol[0], vol[1], vol[2], vol[3]); } void beep_init(void) { gpio_init(PTA10, GPO,1); } void beep(void) { gpio_set(PTA10, 0); lptmr_delay_ms(2); gpio_set(PTA10, 1); lptmr_delay_ms(2); } void main() { uint8 te[1][24]; led_init(LED0); ui_init(); timer_init(1); key_init(); smg_csh(); beep_init(); Sensor_init(); while(1) { Sensor_Proc(); Key_Proc(); smg_set(buffer[0],2); //DELAY_MS(20); sprintf((char*)te[0], "Source: %d\0",vol[1]/10); switch(dispCh) { case 0: Init_UI(0); break; case 1: smg_set(vol[1], 2); LCD_Print(4,2,te[0]); if(vol[1]/10>10) { beep(); } break; } //smg_set(vol[1], 5); DELAY_MS(300); LCD_CLS(); //清屏 } }

2023-06-07 上传