显示游标

1.简单变量接收数据
declare
  cursor employees_cur is select first_name,last_name from employees;
  v_firstname employees.first_name%type;
  v_lastname employees.last_name%type;
begin
  open employees_cur;
  loop
    fetch employees_cur into v_firstname,v_lastname;
    exit when employees_cur%notfound;
    dbms_output.put_line('firstname-->'|| v_firstname || ';lastname-->'||v_lastname);
  end loop;
  close employees_cur;  
end;


2.记录接收数据

declare
  cursor employees_cur is select first_name,last_name from employees;
  v_employees employees_cur%rowtype;
begin
  open employees_cur;
  loop
    fetch employees_cur into v_employees;
    exit when employees_cur%notfound;
    dbms_output.put_line('firstname-->'|| v_employees.first_name || ';lastname-->'||v_employees.last_name);
  end loop;
  close employees_cur;  
end;

declare
  cursor employees_cur is select * from employees;
  v_employees employees%rowtype;
begin
  open employees_cur;
  loop
    fetch employees_cur into v_employees;
    exit when employees_cur%notfound;
    dbms_output.put_line('firstname-->'|| v_employees.first_name || ';lastname-->'||v_employees.last_name);
  end loop;
  close employees_cur;  
end;

3.for循环简化游标
 declare
  cursor employees_cur is select first_name,last_name from employees;  
begin
  for record_name in employees_cur loop
     dbms_output.put_line('firstname-->'|| record_name.first_name || ';lastname-->'||record_name.last_name);  
  end loop;
end;


4.带参数的游标
declare
  cursor employees_cur(deptno number) is select first_name,last_name from employees where department_id=deptno;  
  r employees_cur%rowtype;
begin
  for r in employees_cur(10) loop
    dbms_output.put_line(r.first_name);
  end loop;
  dbms_output.put_line('----------------------');
  for r in employees_cur(20) loop
    dbms_output.put_line(r.first_name);
  end loop;  
  
  dbms_output.put_line('----------------------');
  open employees_cur(30);
  loop
    fetch employees_cur into r;
    exit when employees_cur%notfound;
    dbms_output.put_line(r.first_name);
  end loop;
   close employees_cur; 
end;

5.批量导入数据到record或嵌套表
declare
  type emp_type is table of employees%rowtype index by pls_integer;
  emp_record emp_type;
  emp_row pls_integer;
begin
  select * bulk collect into emp_record from employees;
  dbms_output.put_line('The count is ' || emp_record.count);
  
  emp_row := emp_record.first;
  while (emp_row is not null) loop
    dbms_output.put_line('emp_row:' || emp_record(emp_row).employee_id || ':' || emp_record(emp_row).first_name);
    emp_row := emp_record.next(emp_row);
  end loop;
end;  

6.游标方式
declare
  cursor emp_cur is select * from employees;
  type emp_type is table of employees%rowtype index by pls_integer;
  emp_record emp_type;
  emp_row pls_integer;
  
begin
  open emp_cur;
  fetch emp_cur  bulk collect into emp_record;
  dbms_output.put_line('The count is ' || emp_record.count);
  
  emp_row := emp_record.first;
  while (emp_row is not null) loop
    dbms_output.put_line('emp_row:' || emp_record(emp_row).employee_id || ':' || emp_record(emp_row).first_name);
    emp_row := emp_record.next(emp_row);
  end loop;
  close emp_cur;
end; 

### Oracle 中游标的执行结果展示 在 Oracle 数据库中,要显示游标的运行结果,通常会使用 `DBMS_OUTPUT.PUT_LINE` 来打印每一行的数据。下面是一个完整的 PL/SQL 块示例,用于声明、打开游标并逐行获取数据,最后关闭游标。 #### 使用显式游标显示查询结果 ```plsql DECLARE -- 定义变量存储从游标取出的值 v_code VARCHAR2(20); -- 定义游标c,它将保存来自ALM_TYPE表中的alarm_code列的选择语句的结果 CURSOR c IS SELECT alarm_code FROM ALM_TYPE; BEGIN OPEN c; -- 打开游标 IF c%ISOPEN THEN LOOP FETCH c INTO v_code; -- 将当前行的数据放入到v_code变量中 EXIT WHEN c%NOTFOUND; -- 当没有更多记录时退出循环 DBMS_OUTPUT.PUT_LINE(TO_CHAR(c%ROWCOUNT) || ' - ' || v_code); -- 输出当前行号以及对应的alarm_code值 END LOOP; CLOSE c; -- 关闭游标 ELSE DBMS_OUTPUT.PUT_LINE('错误:游标打开失败!'); END IF; END; / ``` 这段代码展示了如何定义一个简单的显式游标,并通过 `FETCH...INTO` 循环读取每一条记录直到结束[^3]。为了查看实际输出,在 SQL*Plus 或者其他支持 `DBMS_OUTPUT` 的工具里执行此脚本之前,请确保启用了服务器端输出功能: ```bash SET SERVEROUTPUT ON; ``` 对于隐式游标的情况,则不需要手动管理其生命周期(即无需调用 `OPEN`, `CLOSE`),因为这些操作由系统自动处理。但是仍然可以通过内置函数如 `%FOUND`, `%NOTFOUND`, `%ROWCOUNT` 和 `%ISOPEN` 获取有关最近一次 DML 操作的信息[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值