Oracle游标创建和使用的语法和举例(显示和隐式游标)

xiaoxiao2021-02-28  108

游标 注意:与sql的游标定义不同,Oracle游标可以带输入变量和输出类型             使用游标的时候,可以输入参数,也可以不输入

declear cursor 游标名[(变量名 [in] 类型[:=缺省])] [return ret_type] is select query; 其他变量定义; begin open 游标名(参数);--/open 游标名;/open 游标名(); fetch 游标名 into 变量; while 游标名%found loop sentence; fetch 游标名 into 变量; end loop; close 游标名 end 游标可用使用的几个属性 %found是否获取到数据 %notfound是否没有数据 %rowcount受SQL影响的行数 %isopen游标是否打开状态 显式游标的例子 --使用游标获取岗位为employees的姓名+电话+工资 set serveroutput on; declare cursor my_cursor(var_job varchar2:='ST_MAN') is select first_name,phone_number,salary from employees where job_id=var_job and rownum <=3; type my_record is record (var_1 employees.first_name%type, var_2 employees.phone_number%type, var_3 employees.salary%type ); var_myrecord my_record; begin dbms_output.put_line('下面演示使用while语句遍历显示游标,不输入参数'); open my_cursor;--没有输入参数,取缺省 fetch my_cursor into var_myrecord; while my_cursor%found loop --使用游标属性 dbms_output.put_line('员工'||var_myrecord.var_1||'的联系方式为:'||var_myrecord.var_2||',当前工资为:'||var_myrecord.var_3||'。'); fetch my_cursor into var_myrecord; end loop; close my_cursor;--不需要输入变量 dbms_output.put_line('下面演示使用while语句遍历显示游标,输入参数'); open my_cursor('ST_CLERK');--输入参数 fetch my_cursor into var_myrecord; while my_cursor%found loop --使用游标属性 dbms_output.put_line('员工'||var_myrecord.var_1||'的联系方式为:'||var_myrecord.var_2||',当前工资为:'||var_myrecord.var_3||'。'); fetch my_cursor into var_myrecord; end loop; close my_cursor;--不需要输入变量 --使用for语句遍历显示游标 dbms_output.put_line('下面演示使用for语句遍历显示游标,不输入参数'); for var_myrecord2 in my_cursor() loop dbms_output.put_line('员工'||var_myrecord2.first_name||'的联系方式为:'||var_myrecord2.phone_number||',当前工资为:'||var_myrecord2.salary||'。'); end loop; dbms_output.put_line('下面演示使用for语句遍历显示游标,输入参数'); for var_myrecord2 in my_cursor('ST_CLERK') loop dbms_output.put_line('员工'||var_myrecord2.first_name||'的联系方式为:'||var_myrecord2.phone_number||',当前工资为:'||var_myrecord2.salary||'。'); end loop; end; 执行结果 下面演示使用while语句遍历显示游标,不输入参数 员工Matthew的联系方式为:650.123.1234,当前工资为:8000。 员工Adam的联系方式为:650.123.2234,当前工资为:8200。 员工Payam的联系方式为:650.123.3234,当前工资为:7900。 下面演示使用while语句遍历显示游标,输入参数 员工Julia的联系方式为:650.124.1214,当前工资为:3200。 员工Irene的联系方式为:650.124.1224,当前工资为:2700。 员工James的联系方式为:650.124.1334,当前工资为:2400。 下面演示使用for语句遍历显示游标,不输入参数 员工Matthew的联系方式为:650.123.1234,当前工资为:8000。 员工Adam的联系方式为:650.123.2234,当前工资为:8200。 员工Payam的联系方式为:650.123.3234,当前工资为:7900。 下面演示使用for语句遍历显示游标,输入参数 员工Julia的联系方式为:650.124.1214,当前工资为:3200。 员工Irene的联系方式为:650.124.1224,当前工资为:2700。 员工James的联系方式为:650.124.1334,当前工资为:2400。 隐式游标 注意:在一个PL/SQL块中出现多个SQL语句,隐式游标的属性值只反映出紧挨着它上面那条SQL的处理结果 set serveroutput on begin update employees set salary=salary+100 where job_id='AD_VP'; if sql%notfound then dbms_output.put_line(''); else dbms_output.put_line(sql%rowcount||'个员工调整了工资'); end if; end; 执行结果: 匿名块已完成 2个员工调整了工资

for循环语句与游标

通过for语句循环游标,显示游标上面已经举例,下面举例隐式游标。

注意此时自动计数器不是整型,而是record类型的变量

set serveroutput on begin for var_my_record in ( select first_name,phone_number,salary from employees where job_id='AD_VP' and rownum <=3) loop dbms_output.put_line('员工'||var_my_record.first_name||'的联系方式为:'||var_my_record.phone_number||',当前工资为:'||var_my_record.salary||'。'); end loop; end; 执行结果: 匿名块已完成 员工Neena的联系方式为:515.123.4568,当前工资为:17200。 员工Lex的联系方式为:515.123.4569,当前工资为:17200。

博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。
转载请注明原文地址: https://www.6miu.com/read-49693.html

最新回复(0)