SQL游标:过程的循环结构
Oracle数据库通过后台进程在系统内存中创建私有工作区来处理数据操作语言(DML)语句,如INSERT、DELETE或UPDATE。数据库在处理SELECT语句时使用相同的进程,它透明地初始化并分配内存块作为临时工作场所,用于存储语句的信息和结果。指示工作区内存位置的指针是游标。这些工作区和游标对程序员来说是禁区,但是PL/SQL允许显式创建游标,以同样的方式处理SELECT语句。
Oracle和PL/SQL新手?参加Udemy的课程学习更多知识
当PL/SQL处理或执行一条SQL语句时,Oracle会在后台的工作内存中建立一个临时的私有工作区(context area)。此工作区域包含处理语句所需的所有相关信息,例如受影响的行数和返回的数据集。在处理数据操作语言(DML)命令(如INSERT、UPDATE、DELETE或MERGE)时,Oracle数据库建立并控制内存中工作区域的大小和生存期。
SQL跟踪特定的内存块,使用指针(称为游标)分配给特定的活动工作区域。当处理DML语句时,游标有效地存在于后台,对程序员是透明的,超出了它们的控制。但是,在处理SELECT语句时,PL/SQL提供了一种方法,程序员可以通过这种方法寻址这些游标并控制工作区域,在这种情况下,游标被称为显式游标。
显式和隐式游标
游标有两种不同的类型:隐式游标和显式游标。
隐式游标
只要代码中没有显式游标,无论何时用SQL(如SELECT)处理一条语句,PL/SQL都会创建一个隐式游标来建立一个临时工作区。隐式游标得名于程序员没有在语句中显式声明游标这一事实。隐式游标在Oracle的控制下,它自动地执行打开、获取和关闭进程。
隐式游标没有可供程序员使用的可见引用点,因此它们不在程序员的控制范围内。然而,这并不意味着它们是完全透明的。程序员仍然可以通过游标属性检查最近处理的语句的状态。PL/SQL将最近的隐式游标称为SQL游标,它具有%FOUND、%ISOPEN、%NOTFOUND和%ROWCOUNT属性,可以通过SQL %attribute_name访问。
Oracle总是使用隐式游标进行DML处理。当处理INSERT时,游标存储数据。当处理DELETE或UPDATE时,游标会存储受影响的行上的信息。因此,程序员不能在自己的显式游标中使用这些命令。
Oracle为SELECT语句打开一个隐式游标,然后获取该行,然后关闭游标的查询示例是SELECT- into。这是从SELECT语句中获取单个行最快速和最简单的方法。但是,程序员可以显式地声明游标,然后执行打开、获取和关闭进程。当程序员声明和定义一个游标时,结果是一个显式游标。
显式游标
显式游标是一个SELECT语句,由程序员在代码的声明部分中定义并分配了一个名称。使用显式游标,程序员可以完全控制并负责如何从数据库访问信息并存储在临时工作区中。程序员决定什么时候打开游标,什么时候从游标中获取记录——游标中定义的SELECT语句中分配的表/s——要获取多少记录,以及什么时候关闭游标。因为显式游标直接在程序员的控制之下,而且正是这种控制粒度使它们失去了兴趣,所以它们是本文讨论的游标。
创建显式游标
为了创建游标,程序员要模拟隐式游标中使用的过程,比如打开、获取和关闭。然而,需要做的第一件事是通过给游标赋一个名称并定义其关联的SELECT语句来引用游标。
声明一个指针
程序员在PL/SQL代码块的声明段中标识游标。通过声明游标,系统可以初始化临时工作区的内存。
语法:光标cursor_name是select_statement;
上面的语法是声明游标的最简单形式,因为它不提供参数。
用参数和返回子句声明游标的语法如下所示
使用参数声明游标
语法:光标cursor_name(parameter_list)是select_statement
使用Return子句声明游标
语法:光标cursor_name返回字段% ROWTYPEselect_statement
打开游标
语法:开放cursor_name;
打开游标指示系统初始化已分配的内存块并将其分配给工作区。在语句的生命周期中,SELECT语句获取的行将在分配的内存中存储或操作。内存分配将保持保留,直到游标关闭。
获取
语法:取cursor_name成variable_list;
参数:
变量列表——这是逗号分隔的变量列表,用于存储游标的结果
从SELECT语句中的行中获取数据需要一次访问一行。
关闭游标
语法:关闭cursor_name;
关闭游标将释放所有预留分配的内存给系统。如果游标定义在语句结束后没有适当地关闭游标,那么内存将保持保留和空闲。如果太多游标不必要地打开,底层系统将达到允许的并发打开限制,或者耗尽空闲内存资源,最终崩溃。