![openGauss数据库核心技术](https://wfqqreader-1252317822.image.myqcloud.com/cover/206/44510206/b_44510206.jpg)
2.2 存储过程和函数
存储过程是一组SQL语句和逻辑控制的集合。数据库系统需要支持创建、删除和修改存储过程的语法。存储过程相比普通的SQL命令,具有如下优点:
(1)创建的存储过程保存在数据库系统中,在使用时被调出并且在数据库系统本地进行编译执行,一次编译,多次执行,具有很好的执行效率。
(2)数据库系统和应用程序之间通常需要有大量的数据交互,而存储过程可以将应用的逻辑“下推”给数据库系统,降低数据的传输量。
(3)存储过程还具有过程化的控制语句,可以实现固定的业务逻辑,并且通过存储过程的封装,应用程序只需要访问存储过程即可,从而可以使部分基本表对用户透明,提高了数据库系统的安全性。
简而言之,存储过程具有简单、安全、高性能等优点。
2.2.1 存储过程的声明
创建一个存储过程可以通过CREATE PROCEDURE命令来实现,其主要形式如下:
![](https://epubservercos.yuewen.com/34EF7A/23721726509644006/epubprivate/OEBPS/Images/Figure-P60_27564.jpg?sign=1739157657-QIL5PRqOECbXu7K05rY9l4TlTfJlfuwx-0-a0f63689906d714731e8b74ca5ab4ca9)
下面定义一个存储过程。
例2-54:统计warehouse表中元组的数量。具体语句如下:
![](https://epubservercos.yuewen.com/34EF7A/23721726509644006/epubprivate/OEBPS/Images/Figure-P61_27567.jpg?sign=1739157657-IvFjw05ZKJEqvy8pcUHfke7PbMn55qTf-0-a84e98bf22d90f2a263861193613803c)
存储过程可以带有参数,参数的类型就是SQL标准中的多种类型,在向存储过程传递参数时需要保证参数类型的一致,否则存储过程就无法正常执行。
存储过程的参数有3种不同的输入/输出模式:IN、OUT、INOUT。
(1)IN参数是存储过程的输入参数,它将存储过程外部的值传递给存储过程使用。
(2)OUT参数是存储过程的输出参数,存储过程在执行时,会将执行的中间结果赋值给OUT参数,存储过程执行完毕后,外部用户可以通过OUT参数获得存储过程的执行结果。
(3)INOUT参数则同时具有IN参数和OUT参数的性质,它既是存储过程的输入参数,同时在存储过程执行中也会通过INOUT参数将中间结果输出给外部用户。
例2-55:向new_orders基本表中插入数据。具体语句如下:
![](https://epubservercos.yuewen.com/34EF7A/23721726509644006/epubprivate/OEBPS/Images/Figure-P61_27568.jpg?sign=1739157657-zGOE2tMROkjMTLNJ4m4PuFPnDlrBCqnY-0-44d8d3eca618b2680fb9bafa1cceb7c9)
调用存储过程,具体语句如下:
![](https://epubservercos.yuewen.com/34EF7A/23721726509644006/epubprivate/OEBPS/Images/Figure-P61_27569.jpg?sign=1739157657-qPn5JEFZYbG9DvBdaPuh6bxvvQWHFHxk-0-201f35b0d6cbf6d2149360a590b8fc25)
检查存储过程的效果,具体语句如下:
![](https://epubservercos.yuewen.com/34EF7A/23721726509644006/epubprivate/OEBPS/Images/Figure-P62_27573.jpg?sign=1739157657-i8CG8uxzsglvOX5uzWRckJSnMqcDBrC4-0-6c38684493470754429e9c1339f538b0)
2.2.2 存储过程的修改
SQL中没有提供显式的存储过程修改命令,通常需要通过REPLACE关键字来指定使用当前的存储过程替代之前的同名存储过程。
例2-56:将例2-54定义的存储过程替换为按照地区分组的数量统计。具体语句如下:
![](https://epubservercos.yuewen.com/34EF7A/23721726509644006/epubprivate/OEBPS/Images/Figure-P62_27574.jpg?sign=1739157657-J7TF8AVlTTICYXkVVOLW49mODFz55RGq-0-be0245c93653295807f0cdb756b54d3c)
2.2.3 函数的声明和修改
函数的使用方法和存储过程类似。具体语句如下:
![](https://epubservercos.yuewen.com/34EF7A/23721726509644006/epubprivate/OEBPS/Images/Figure-P62_27575.jpg?sign=1739157657-W9UNH12sLVWroVgvfMBOQ8eSMdooTVnz-0-a4fe1889399321e9760ca6f6553d476c)
但是函数可以应用在SQL语句中,而存储过程则必须独立调用,另外函数必须指定返回值。
例2-57:向new-orders表中插入数据,并将new-orders中的元组数作为返回值,具体语句如下:
![](https://epubservercos.yuewen.com/34EF7A/23721726509644006/epubprivate/OEBPS/Images/Figure-P63_27580.jpg?sign=1739157657-9CWHX9t7GMriaiqK3U9cb8E55qfkftci-0-48023b3be66ad388d256cfcbed1e77d9)
执行获得返回值:
![](https://epubservercos.yuewen.com/34EF7A/23721726509644006/epubprivate/OEBPS/Images/Figure-P63_27581.jpg?sign=1739157657-EVKvjlzXpB1jvuOche31ebj5wh2JjTph-0-3d28f6c1b67d3fa4888344955c1d676b)