泰克Tech 发表于 2024-10-18 15:42:02

泰涨知识 | 【openGauss详解】存储过程的应用

【openGauss】数据库

存储过程的应用




一、

存储过程




存储过程是一组可以完成特定功能的SQL语句集合,经编译后存储在数据库中。存储过程的执行效率比逐条执行的SQL语句高很多,因为普通的SQL语句,每次都会对SQL进行解析、编译、执行,而存储过程只是在第一次执行时进行解析、编译、执行,以后都是对结果进行调用。




存储过程解析工作就是在SOL引擎模块中完成。




1

存储过程语法如下:


https://picx.zhimg.com/80/v2-442458a44be09ccb6a098c78878c08b4_720w.jpg







添加图片注释,不超过 140 字(可选)




OR REPLACE:存储过程没有alter procedure,但可以使用or replace替换原存储过程,create or replace当存储过程不存在时做创建,当存储过程存在时做替换。




DEFINER = user:用于指定当前存储过程定义者,默认DEFINER=CURRENT_USER。




argmode:参数模式,取值为:IN(输入参数)、OUT(输出参数)、INOUT(输入输出参数),默认是IN。




{ DEFAULT | := | = } :可以给输入参数设置默认值,DEFAULT、:=、=作用是一样的。




IS、AS:语法格式要求,必须写其中一个。两个相同。




BEGIN、END:语法格式要求,必须写。




2

存储过程实例:




实例1:创建存储过程


https://pica.zhimg.com/80/v2-81e45143bbca2c177276ba5cd00da2d9_720w.webp







添加图片注释,不超过 140 字(可选)




实例2:调用存储过程


https://picx.zhimg.com/80/v2-fbebceeed3bd031a85ed4f6dc5974db1_720w.webp







添加图片注释,不超过 140 字(可选)




虽然第二个参数是输出参数,但是在调用存储过程的时候也需要传值,否则会报错。


https://picx.zhimg.com/80/v2-3ba1dd9a1e0bc34ac91ff1e7a2ac2d54_720w.webp







添加图片注释,不超过 140 字(可选)




正常调用执行结果如下所示:


https://pic1.zhimg.com/80/v2-ec3dca5221cb1322cc906f3c71f7c063_720w.webp







添加图片注释,不超过 140 字(可选)




实例3:删除存储过程


https://pic1.zhimg.com/80/v2-8bdb329c0a0ab34b829d82cb17fefede_720w.webp







添加图片注释,不超过 140 字(可选)




实例4:在存储过程中执行判断




在存储过程编写过程中可能会出现需要根据不同情况执行不同操作的情况,那么此时可以使用流程控制即判断来实现,openGauss数据库支持if…else if…else…end if也支持case when…then…end case完成流程控制。




① if…elif…else


https://picx.zhimg.com/80/v2-0c74a16b9e9858adc557fe0abf829d92_720w.webp







添加图片注释,不超过 140 字(可选)

使用了几次if最终判断结束的时候就需要几个end if。




② if…else if…else


https://picx.zhimg.com/80/v2-d85aba9701b9ade019964c85033e19c6_720w.webp







添加图片注释,不超过 140 字(可选)




使用了几次if最终判断结束的时候就需要几个end if,因为这个是if嵌套。




③ case when…then…end case


https://picx.zhimg.com/80/v2-ab29e492649395bf847958a9557c3ad3_720w.webp







添加图片注释,不超过 140 字(可选)




实例5:在存储过程中执行循环




在存储过程中如果想要分别获取数据集中的数据,此时就需要循环遍历数据集,或需要重复执行相同操作也可以使用循环实现,openGauss数据支持的循环有for、while、loop。


https://picx.zhimg.com/80/v2-311ec0772b99699dabb406237eae9b29_720w.webp







添加图片注释,不超过 140 字(可选)




① for循环


https://picx.zhimg.com/80/v2-a163a6596af1305bb20ee77577e4474f_720w.webp







添加图片注释,不超过 140 字(可选)

startnum … endnum相当于生成了一个startnum开始到endnum结束的整数序列,如果startnum=1,endnum=10,那么此时整数序列为1-10(包含10),一共循环10次,i的取值分别是1,2,3,4,5,6,7,8,9,10。




② while循环


https://picx.zhimg.com/80/v2-0aae8fcb8fbac8b524d90a02416cc13d_720w.webp







添加图片注释,不超过 140 字(可选)




③ loop循环


https://picx.zhimg.com/80/v2-f3af6a70e6baec58bebefd1793f4866c_720w.webp







添加图片注释,不超过 140 字(可选)




实例6:使用存储过程从表中查询一个具体值




当确定查询的内容仅一行一列时,可以将该单元格的数据赋值给输出参数进行输出。




① 创建表并插入数据


https://picx.zhimg.com/80/v2-3136bd860f758abeff6b1b1616d733d1_720w.webp







添加图片注释,不超过 140 字(可选)




② 创建存储过程


https://picx.zhimg.com/80/v2-96c0187fc846003767e9667a7e53ff26_720w.webp







添加图片注释,不超过 140 字(可选)




③ 调用存储过程


https://pic1.zhimg.com/80/v2-65b3ba82f56e1a4465b93fac5b710309_720w.webp







添加图片注释,不超过 140 字(可选)




查询结果如下:


https://pic1.zhimg.com/80/v2-b985c4b7919ad179c3ecb51316b175ba_720w.webp







添加图片注释,不超过 140 字(可选)




实例7:使用存储过程查询表数据




当查询一个单元格的数据是可以使用输出参数,但当查询多行/多列/多行多列时需要借助于循环进行遍历。可以使用游标也可以不使用




① 不使用游标


https://picx.zhimg.com/80/v2-cb494788347f68e4dded24fc925e6fe4_720w.webp







添加图片注释,不超过 140 字(可选)




raise notice表示已notice日志的形式输出数据,输出字符串。




'%,%'就是要输出的字符串,%为占位符,字符串后的第一个值传给第一个占位符,依次赋值。





https://pic1.zhimg.com/80/v2-1bd4aac03647c371ea6dcf486a9066e4_720w.webp







添加图片注释,不超过 140 字(可选)




② 使用游标,for遍历游标


https://picx.zhimg.com/80/v2-0f9e3133a53174ce7099d3af1d65b98c_720w.webp







添加图片注释,不超过 140 字(可选)

for会自动打开并关闭游标,不需要用户操作游标的打开、取值、关闭。




③ 使用游标,按游标操作使用


https://picx.zhimg.com/80/v2-0542ee28de332f259fcd06e133c14259_720w.webp







添加图片注释,不超过 140 字(可选)







END




更多精彩内容 尽在泰克教育

请持续关注




页: [1]
查看完整版本: 泰涨知识 | 【openGauss详解】存储过程的应用