游标语法大全
Oracle游标使用方法及语法大全

【训练1】 用游标提取emp表中7788雇员的名称和职务。
Sql代码:
1.SET SERVEROUTPUT ON
2.DECLARE
3.v_ename VARCHAR2(10);
4.v_job VARCHAR2(10);
5.CURSOR emp_cursor IS
6.SELECT ename,job FROM emp WHERE empno=7788;
当系统使用一个隐式游标时,可以通过隐式游标的属性来了解操作的状态和结果,进而控制程序的流程。隐式游标可以使用名字SQL来访问,但要注意,通过SQL游标名总是只能访问前一个DML操作或单行SELECT操作的游标属性。所以通常在刚刚执行完操作之后,立即使用SQL游标名来访问属性。游标的属性有四种,如下所示。
游标有两种类型:显式游标和隐式游标。在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标。但是如果要提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。显式游标对应一个返回结果为多行多列的SELECT语句。
End loop;
Close c_emp;
End;
%ROWTYPE也可以用游标名来定义,这样的话就必须要首先声明游标:
For record_name IN(corsor_name[(parameter[,parameter]…)]
|(query_difinition) loop
Statements
End loop;
下面我们用for循环重写上面的例子:
在游标FOR循环中使用查询
在游标FOR循环中可以定义查询,由于没有显式声明所以游标没有名字,记录名通过游标查询来定义。
游标及函数的使用及举例

游标的使用及举例一、声明游标在使用一个游标之前,要先声明游标。
可以采用DECLARE语句声明一个游标,语法见表8-22所示。
表8-22 DECLARE声明游标的语法序号语法说明1DECLARE 游标名称CURSOR定义游标名2[ LOCAL | GLOBAL ]指定游标的作用域是局部或是全局的3[ FORWARD_ONLY | SCROLL ]指定游标只能逐次向下一行或是可以移动到任意指定位置4[ READ_ONLY ]指定游标为只读游标5FOR SELECT 语句定义游标结果集的SELECT 语句6[ FOR UPDATE [ OF列名[ ,...n ] ] ]定义游标内可更新的列,如果在UPDATE中未指定列的列表,除非指定了READ_ONLY选项,否则所有列均可更新二、打开游标用DECLARE语句声明游标时并不执行SELECT查询语句,只有当用OPEN语句打开游标时才能执行查询语句,OPEN语句的语法见表8-23所示。
表8-23 OPEN语句的语法序号语法说明1OPEN [GLOBAL] 游标名称打开游标三、从游标中提取数据在游标打开后,可以使用FETCH语句从游标中提取数据并进行操作,FETCH语句的语法见表8-24所示。
表8-24 FETCH语句的语法序号语法说明1FETCH [NEXT|PRIOR|FIRST|LAST |ABSOLUTE n |RELATIVE n]根据指定读取记录的位置提取游标中的数据,指定位置分别为当前行的下一行、当前行的上一行、第一行、最后一行、第n行(参照第一行)、第n行(参照当前行)2FROM [GLOBAL]游标名称指定要从中提取数据的游标名称3[INTO @变量名[ ,...n ] ]将提取的数据存放到指定的局部变量中FETCH语句每次只能提取一行数据,其执行的状态值保存在全局变量@@FETCH_STATUS中,当@@FETCH_STATUS为0时,表示FETCH语句执行成功;当@@FETCH_STATUS为-1时,表示FETCH 语句失败或此行不在结果集中;当@@FETCH_STATUS为-2时,表示被提取的行不存在。
sql游标的使用方法

sql游标的使用方法
SQL游标用于在查询结果集中遍历每一行数据,可以使用以下步骤来使用游标:
1. 声明游标:使用DECLARE语句声明一个游标,指定查询语句,并设置游标的名称。
2. 打开游标:使用OPEN语句打开游标,将查询结果集绑定到游标上。
3. 获取数据:使用FETCH语句从游标中获取数据,可以根据需要获取一行数据或者获取全部数据。
4. 处理数据:对获取的数据进行需要的处理,可以进行计算、更新、删除等操作。
5. 关闭游标:使用CLOSE语句关闭游标,释放资源。
6. 释放游标:使用DEALLOCATE语句释放游标所占用的资源。
下面是一个使用游标的示例:
```sql
DECLARE cur_employee CURSOR FOR
SELECT employee_id, employee_name FROM employees; OPEN cur_employee;
FETCH NEXT FROM cur_employee INTO @emp_id, @emp_name;
WHILE @@FETCH_STATUS = 0
BEGIN
-- 对数据进行处理
...
FETCH NEXT FROM cur_employee INTO @emp_id, @emp_name;
END
CLOSE cur_employee;
DEALLOCATE cur_employee;
```。
oracle游标的用法

oracle游标的用法Oracle游标的用法本文将针对Oracle数据库中游标的用法进行详细讲解。
以下是一些常用的游标用法:1.隐式游标隐式游标是Oracle数据库默认为每个SQL语句自动创建的游标。
使用隐式游标时,我们可以通过%ROWCOUNT系统变量获取受影响的行数,通过%FOUND、%NOTFOUND和%ISOPEN系统变量判断该游标的状态。
示例代码:DECLAREl_count NUMBER;BEGINUPDATE employees SET salary = salary * ;l_count := SQL%ROWCOUNT;IF SQL%FOUND THENDBMS__LINE('成功更新了 ' || l_count || ' 条记录。
');END IF;END;2.显式游标显式游标是由程序员显式创建和控制的游标。
与隐式游标相比,显式游标提供了更大的灵活性,可以更好地处理大量的数据。
示例代码:DECLARECURSOR cursor_name IS SELECT * FROM employees;l_employee employees%ROWTYPE;BEGINOPEN cursor_name;LOOPFETCH cursor_name INTO l_employee;EXIT WHEN cursor_name%NOTFOUND;-- 对l_employee进行处理END LOOP;CLOSE cursor_name;END;在上述示例代码中,我们使用显式游标cursor_name查询了employees表的所有记录。
然后,通过循环获取每一条记录并对其进行处理,直到游标的%NOTFOUND属性为真时退出循环。
3.游标参数化游标参数化允许我们在游标声明中传递参数,以动态地定义游标查询的条件。
通过参数化游标,我们可以根据不同的条件查询不同的数据集。
示例代码:DECLARECURSOR cursor_name (param1 VARCHAR2, param2 NUMB ER) ISSELECT * FROM employees WHERE department_id = param1 AND salary > param2;l_employee employees%ROWTYPE;BEGINOPEN cursor_name('IT', 5000);LOOPFETCH cursor_name INTO l_employee;EXIT WHEN cursor_name%NOTFOUND;-- 对l_employee进行处理END LOOP;CLOSE cursor_name;END;在上述示例代码中,我们使用参数化游标cursor_name查询了部门ID为’IT’且薪水大于5000的员工信息。
oracle游标用法

oracle游标用法标题:深入理解与应用Oracle游标Oracle游标是一种用于处理数据库查询结果集的机制。
它允许用户在PL/SQL块中一次处理一行数据,而不是一次性获取所有结果。
这对于处理大量数据或者需要精细控制数据处理流程的情况非常有用。
以下是一步一步详解Oracle游标的用法。
一、游标的基本概念游标在数据库中是一个十分重要的概念,它可以看作是数据库查询结果集的一个指针。
当我们执行一个SELECT语句时,数据库会返回一个结果集,而游标就是指向这个结果集的指针。
我们可以通过移动游标来访问结果集中的每一行数据。
二、创建游标在Oracle中,我们使用DECLARE关键字来声明一个游标,语法如下:sqlDECLAREcursor_name CURSOR ISSELECT column1, column2,...FROM table_name[WHERE condition];其中,cursor_name是我们为游标指定的名称,column1, column2,...是要从表table_name中选择的列,[WHERE condition]是可选的,用于指定查询条件。
例如,我们有一个员工表EMP,我们要创建一个游标来获取所有的员工信息:sqlDECLAREemp_cursor CURSOR ISSELECT * FROM EMP;三、打开和关闭游标创建游标后,我们需要使用OPEN关键字来打开游标,以便我们可以开始处理结果集。
当处理完所有数据后,我们需要使用CLOSE关键字来关闭游标。
sqlBEGINOPEN emp_cursor;处理游标数据CLOSE emp_cursor;END;四、提取游标数据我们使用FETCH关键字从游标中获取一行数据。
FETCH语句的语法如下:sqlFETCH cursor_name INTO variable1, variable2,...其中,variable1, variable2,...是我们用来存储从游标中提取的数据的变量。
游标的用法

--关闭游标:
close company_cur;
if company_cur%isopen
then
close company_cur;
end if;
/*=================游标属性=================*/
--显式游标属性:
%found --检查记录是否被成功取回;
is
begin
......
end;
--注意:与游标变量关联的open for语句中的查询不能使用for update子句。
--尽量避免在游标中使用count(*)
--强烈建议使用游标的两次取回配合游标属性%notfound来判断记录数是否大于一条;
declare
cursor tStkLsKc_cur(vs_OrgCode Code%type) is
/*=================for update子句=================*/
--for update子句:
select A.PluId,B.PluName --锁定tStkPc,tSkuPlu中的行
from tStkPc A,tSkuPlu B
where A.PluId=B.PluId
where company_id=10;
/*=================在包中使用游标=================*/
--在包中使用游标返回记录:
package company
is
cursor company_cur (id_in number:=10) return company%rowtype;
end company;
cursor用法

cursor用法游标(Cursor)是在数据库系统中用于访问和操作数据的一个指针。
它允许用户在数据库中的表中沿着行进行定位,并可以根据需要检索和更新数据。
在本文中,将详细介绍游标的用法,包括游标的类型、创建和使用游标、游标的属性和方法等方面的内容。
一、游标的类型在数据库系统中,通常有两种类型的游标:静态游标和动态游标。
1. 静态游标(Static Cursor):静态游标在创建时会将所有满足条件的记录复制到临时表中,然后通过游标进行操作。
静态游标可以在遍历期间更新和插入数据,但是插入和更新的数据只能在遍历结束后对表进行操作。
2. 动态游标(Dynamic Cursor):动态游标在创建时不会复制数据,而是直接通过游标访问源表。
动态游标可以在遍历期间实时更新和插入数据,而不需要等到遍历结束。
这种类型的游标通常用于需要及时反馈修改结果的应用场景。
二、创建和使用游标创建游标的一般步骤如下:1. 声明游标变量:首先,需要在数据库系统中声明一个游标变量,用于存储游标的信息和状态。
游标变量通常是根据游标类型和数据库系统的相关规则进行声明。
以Oracle为例,可以使用以下语法来声明一个游标变量:DECLARE cursor_name CURSOR [STATIC , DYNAMIC][FORWARD_ONLY , SCROLL]FOR select_statement;在这个语法中,cursor_name是游标变量的名称,STATIC或DYNAMIC用于指定静态游标或动态游标的类型,FORWARD_ONLY或SCROLL用于指定游标的滚动性。
2.打开游标:在声明游标变量之后,需要通过打开操作将游标变量与数据相关联。
可以使用OPEN语句打开游标,语法如下:OPEN cursor_name;这个语句将打开游标变量,并使其与SELECT语句关联起来。
3.检索数据:一旦游标打开,就可以使用FETCH语句从游标中检索数据。
sql server 游标语句

sql server 游标语句以下是19条以上的SQL Server游标语句示例:1. 声明一个游标:sqlDECLARE cursor_name CURSOR FOR SELECT column_name FROM table_name;2. 开启一个游标:sqlOPEN cursor_name;3. 获取游标中的下一行数据并将其存储在变量中:sqlFETCH NEXT FROM cursor_name INTO @variable_name;4. 检查是否还有更多的行可以读取:sqlWHILE @@FETCH_STATUS = 05. 关闭一个游标:sqlCLOSE cursor_name;6. 释放一个游标:sqlDEALLOCATE cursor_name;7. 游标中使用多个列的示例:sqlDECLARE cursor_name CURSOR FORSELECT column1, column2 FROM table_name;8. 使用游标获取行数并打印每一行:sqlDECLARE cursor_name CURSOR FOR SELECT column_name FROM table_name;OPEN cursor_name;DECLARE @value datatype;FETCH NEXT FROM cursor_name INTO @value;WHILE @@FETCH_STATUS = 0BEGINPRINT @value;FETCH NEXT FROM cursor_name INTO @value;END;CLOSE cursor_name;DEALLOCATE cursor_name;9. 使用游标通过循环插入数据:sqlDECLARE cursor_name CURSOR FOR SELECT column_name FROM table_name;OPEN cursor_name;DECLARE @value datatype;FETCH NEXT FROM cursor_name INTO @value;WHILE @@FETCH_STATUS = 0BEGININSERT INTO target_table (column_name) VALUES (@value);FETCH NEXT FROM cursor_name INTO @value;END;CLOSE cursor_name;DEALLOCATE cursor_name;10. 使用游标更新数据:sqlDECLARE cursor_name CURSOR FOR SELECT column_name FROM table_name;OPEN cursor_name;DECLARE @value datatype;FETCH NEXT FROM cursor_name INTO @value;WHILE @@FETCH_STATUS = 0BEGINUPDATE target_table SET column_name = @new_value WHERE column_name = @value;FETCH NEXT FROM cursor_name INTO @value;END;CLOSE cursor_name;DEALLOCATE cursor_name;11. 使用游标删除数据:sqlDECLARE cursor_name CURSOR FOR SELECT column_name FROM table_name;OPEN cursor_name;DECLARE @value datatype;FETCH NEXT FROM cursor_name INTO @value;WHILE @@FETCH_STATUS = 0BEGINDELETE FROM target_table WHERE column_name = @value;FETCH NEXT FROM cursor_name INTO @value;END;CLOSE cursor_name;DEALLOCATE cursor_name;12. 使用游标计算总和:sqlDECLARE cursor_name CURSOR FOR SELECT column_name FROM table_name;OPEN cursor_name;DECLARE @value datatype;DECLARE @sum datatype;SET @sum = 0;FETCH NEXT FROM cursor_name INTO @value;WHILE @@FETCH_STATUS = 0BEGINSET @sum = @sum + @value;FETCH NEXT FROM cursor_name INTO @value; END;CLOSE cursor_name;DEALLOCATE cursor_name;PRINT @sum;13. 使用游标进行条件筛选:sqlDECLARE cursor_name CURSOR FOR SELECT column_name FROM table_name WHERE condition;14. 使用游标进行排序:sqlDECLARE cursor_name CURSOR FOR SELECT column_name FROM table_name ORDER BY column_name;15. 使用游标限制结果集:sqlDECLARE cursor_name CURSOR FOR SELECT TOP 10 column_name FROM table_name;16. 使用游标更新多个列:sqlDECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name;OPEN cursor_name;DECLARE @value1 datatype;DECLARE @value2 datatype;FETCH NEXT FROM cursor_name INTO @value1, @value2;WHILE @@FETCH_STATUS = 0BEGINUPDATE target_table SET column1 = @new_value1, column2 = @new_value2 WHERE column1 = @value1 AND column2 = @value2;FETCH NEXT FROM cursor_name INTO @value1, @value2; END;CLOSE cursor_name;DEALLOCATE cursor_name;17. 使用游标检查是否存在重复数据:sqlDECLARE cursor_name CURSOR FOR SELECT column_name FROM table_name;OPEN cursor_name;DECLARE @value datatype;DECLARE @count int;FETCH NEXT FROM cursor_name INTO @value;WHILE @@FETCH_STATUS = 0BEGINSET @count = (SELECT COUNT(*) FROM target_table WHERE column_name = @value);IF @count > 1BEGIN执行相关操作END;FETCH NEXT FROM cursor_name INTO @value;END;CLOSE cursor_name;DEALLOCATE cursor_name;18. 使用游标将数据导入到临时表:sqlDECLARE cursor_name CURSOR FOR SELECT column_name FROM table_name;OPEN cursor_name;DECLARE @value datatype;FETCH NEXT FROM cursor_name INTO @value;WHILE @@FETCH_STATUS = 0BEGININSERT INTO #temp_table (column_name) VALUES (@value);FETCH NEXT FROM cursor_name INTO @value;END;CLOSE cursor_name;DEALLOCATE cursor_name;19. 使用游标将数据导出为XML格式:sqlDECLARE cursor_name CURSOR FOR SELECT column_name FROMtable_name FOR XML AUTO, ELEMENTS;OPEN cursor_name;DECLARE @value xml;FETCH NEXT FROM cursor_name INTO @value;WHILE @@FETCH_STATUS = 0BEGIN执行操作,将XML保存到文件或变量中FETCH NEXT FROM cursor_name INTO @value;END;CLOSE cursor_name;DEALLOCATE cursor_name;请注意,在编写使用游标的SQL语句时,应尽量避免使用游标,因为游标操作通常会降低查询性能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle游标使用方法及语法大全当查询返回结果超过一行时,就需要一个显式游标,此时用户不能使用select into语句。
PL/SQL管理隐式游标,当查询开始时隐式游标打开,查询结束时隐式游标自动关闭。
显式游标在PL/SQL块的声明部分声明,在执行部分或异常处理部分打开,取出数据,关闭。
使用游标语法:例:SET SERVERIUTPUT ONDECLARE R_emp EMP%ROWTYPE;CURSOR c_emp IS select * from emp;BEGINOPEN c_emp;LoopFETCH c_emp into r_emp;EXIT WHEN C_EMP%NOTFOUND;Dbms_output.put_line(\’Salary of Employee\’||r_emp.ename||\’is’\)End loop;Close c_emp;End;%ROWTYPE也可以用游标名来定义,这样的话就必须要首先声明游标:For record_name IN(corsor_name[(parameter[,parameter]…)]|(query_difinition) loopStatementsEnd loop;下面我们用for循环重写上面的例子:在游标FOR循环中使用查询在游标FOR循环中可以定义查询,由于没有显式声明所以游标没有名字,记录名通过游标查询来定义。
游标中的子查询语法如下:可以看出与SQL中的子查询有没什么区别。
游标中的更新和删除在PL/SQL中依然可以使用UPDA TE和DELETE语句更新或删除数据行。
显示游标只有在需要获得多行数据的情况下使用。
PL/SQL提供了仅仅使用游标就可以执行删除或更新记录的方法。
UPDATE或DELETE语句中的WHERE CURRENT OF子串专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。
要使用这个方法,在声明游标时必须使用FOR UP DATE子串,当对话使用FOR UPDATE子串打开一个游标时,所有返回集中的数据行都将处于行级(ROW-LEVEL)独占式锁定,其他对象只能查询这些数据行,不能进行UPDATE、DELETE或SELECT...FOR UPDATE操作。
语法:在多表查询中,使用OF自居来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。
如果这些数据行已经被其他会话锁定,那么正常情况下oracle将等待,直到数据行解锁。
在UPDATE和DELETE中使用WHERE CURRENT OF子串的语法如下:WHERE {CURRENT OF cursor_name|search_condition}实例:DELCARECURSOR c1 ISSELECT empno,salary FROM empWHERE comm IS NULLFOR UPDATE OF comm;v_comm NUMBER(10,2);BEGINFOR r1 IN c1 LOOPIF r1.salary<500 THENv_comm:=r1.salary*0.25;ELSEIF r1.salary<1000 THENv_comm:=r1.salary*0.20;ELSEIF r1.salary<3000 THENv_comm:=r1.salary*0.15;ELSE v_comm:=r1.salary*0.12;END IF;UPDATE empSET comm=v_commWHERE CURRENT OF c1;END LOOP;END===================================================== oracle 隐式游标,显示游标,游标循环动态SELECT语句和动态游标,异常处理,自定义异常游标的概念:游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。
游标的作用就是用于临时存储从数据库中提取的数据块。
在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。
这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。
游标有两种类型:显式游标和隐式游标。
在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标。
但是如果要提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。
显式游标对应一个返回结果为多行多列的SELECT语句。
游标一旦打开,数据就从数据库中传送到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。
隐式游标:如前所述,DML操作和单行SELECT语句会使用隐式游标,它们是:* 插入操作:INSERT。
* 更新操作:UPDATE。
* 删除操作:DELETE。
* 单行查询操作:SELECT ... INTO ...。
当系统使用一个隐式游标时,可以通过隐式游标的属性来了解操作的状态和结果,进而控制程序的流程。
隐式游标可以使用名字SQL来访问,但要注意,通过SQL游标名总是只能访问前一个DML操作或单行SELECT操作的游标属性。
所以通常在刚刚执行完操作之后,立即使用SQL游标名来访问属性。
游标的属性有四种,如下所示。
Sql代码:隐式游标的属性返回值类型意义1.SQL%ROWCOUNT 整型代表DML语句成功执行的数据行数2.SQL%FOUND 布尔型值为TRUE代表插入、删除、更新或单行查询操作成功3.SQL%NOTFOUND 布尔型与SQL%FOUND属性返回值相反4.SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假【训练1】使用隐式游标的属性,判断对雇员工资的修改是否成功。
步骤1:输入和运行以下程序:Sql代码:1. SET SERVEROUTPUT ON2. BEGIN3. UPDATE emp SET sal=sal+100 WHERE empno=1234;4. IF SQL%FOUND THEN5. DBMS_OUTPUT.PUT_LINE('成功修改雇员工资!');6. COMMIT;7.ELSE8. DBMS_OUTPUT.PUT_LINE('修改雇员工资失败!');9.END IF;10. END;运行结果为:Sql代码:1.修改雇员工资失败!2.PL/SQL 过程已成功完成。
步骤2:将雇员编号1234改为7788,重新执行以上程序:运行结果为:Sql代码:1.成功修改雇员工资!2.PL/SQL 过程已成功完成。
说明:本例中,通过SQL%FOUND属性判断修改是否成功,并给出相应信息。
显式游标:游标的定义和操作游标的使用分成以下4个步骤。
1.声明游标在DECLEAR部分按以下格式声明游标:CURSOR 游标名[(参数1 数据类型[,参数2 数据类型...])]IS SELECT语句;参数是可选部分,所定义的参数可以出现在SELECT语句的WHERE子句中。
如果定义了参数,则必须在打开游标时传递相应的实际参数。
SELECT语句是对表或视图的查询语句,甚至也可以是联合查询。
可以带WHERE条件、ORDER BY或GROUP BY等子句,但不能使用INTO子句。
在SELECT语句中可以使用在定义游标之前定义的变量。
2.打开游标在可执行部分,按以下格式打开游标:OPEN 游标名[(实际参数1[,实际参数2...])];打开游标时,SELECT语句的查询结果就被传送到了游标工作区。
3.提取数据在可执行部分,按以下格式将游标工作区中的数据取到变量中。
提取操作必须在打开游标之后进行。
FETCH 游标名 INTO 变量名1[,变量名2...];或FETCH 游标名 INTO 记录变量;游标打开后有一个指针指向数据区,FETCH语句一次返回指针所指的一行数据,要返回多行需重复执行,可以使用循环语句来实现。
控制循环可以通过判断游标的属性来进行。
下面对这两种格式进行说明:第一种格式中的变量名是用来从游标中接收数据的变量,需要事先定义。
变量的个数和类型应与SELECT语句中的字段变量的个数和类型一致。
第二种格式一次将一行数据取到记录变量中,需要使用%ROWTYPE事先定义记录变量,这种形式使用起来比较方便,不必分别定义和使用多个变量。
定义记录变量的方法如下:变量名表名|游标名%ROWTYPE;其中的表必须存在,游标名也必须先定义。
4.关闭游标CLOSE 游标名;显式游标打开后,必须显式地关闭。
游标一旦关闭,游标占用的资源就被释放,游标变成无效,必须重新打开才能使用。
以下是使用显式游标的一个简单练习。
【训练1】用游标提取emp表中7788雇员的名称和职务。
Sql代码:1. SET SERVEROUTPUT ON2. DECLARE3. v_ename VARCHAR2(10);4. v_job VARCHAR2(10);5. CURSOR emp_cursor IS6. SELECT ename,job FROM emp WHERE empno=7788;7. BEGIN8. OPEN emp_cursor;9. FETCH emp_cursor INTO v_ename,v_job;10. DBMS_OUTPUT.PUT_LINE(v_ename||','||v_job);11. CLOSE emp_cursor;12. END;执行结果为:Sql代码:1.SCOTT,ANALYST2.PL/SQL 过程已成功完成。
说明:该程序通过定义游标emp_cursor,提取并显示雇员7788的名称和职务。
作为对以上例子的改进,在以下训练中采用了记录变量。
【训练2】用游标提取emp表中7788雇员的姓名、职务和工资。
Sql代码:1.SET SERVEROUTPUT ON2. DECLARE3. CURSOR emp_cursor IS SELECT ename,job,sal FROM emp WHERE empno=7788;4. emp_record emp_cursor%ROWTYPE;5. BEGIN6.OPEN emp_cursor;7. FETCH emp_cursor INTO emp_record;8. DBMS_OUTPUT.PUT_LINE(emp_record.ename||','|| emp_record.job||','|| emp_record.sal);9. CLOSE emp_cursor;10. END;执行结果为:Sql代码:1.SCOTT,ANALYST,30002.PL/SQL 过程已成功完成。