oracle 之 循环、游标

本文介绍了PL/SQL的基础知识,包括IF-ELSE结构、循环控制结构、游标使用方法等,并通过实例展示了如何进行简单的数据操作及查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.IF-ELSE 结构

set serverout on
declare
    v_empno emp.empno%type:=&p_empno;
    v_sal emp.sal%type;
begin
    select sal into v_sal from emp where empno= v_emono;
    if v_sal<1500 then
        dbms_output.put_line('工资等级为一级');
    elseif v_sal<3000 then
        dbms_output.put_line('工资等级为一级');
    else
        dbms_output.put_line('工资等级为一级');
    end if;
end;
/

2.LOOP简单循环(打印1-10)

set serverout on
declare
    --定义循环初始值
     i number(10):=0;
begin
    loop
    --改变增量
    i:=i+1;
    dbms_output.put_line(i);
    --循环退出条件
    exit when i = 10;
    end loop;
end;
/

3.LOOP 打印偶数值

declare
    i number(10):=0;
begin
    loop
        if mod(i,2)=0 then
        dbms_output.put_line(i);
        end if;

        i:i+1;
        exit when i = 10;
    end loop;
end;
/

4.while循环打印1-10

set serverout on
declare
    i number(10):=0;
begin
    --定义 while 循环
    while i<=10 loop
        --循环操作
        dbms_output.put_line(i);
        --改变循环条件
        i:=i+1;
    end loop;
end;
/
### 5.FOR 循环
set serverout on
begin
    for i in 1..10 loop
        dbms_output.put_line(i);
    end loop;
end;
/

6.批量添加数据

-- 生成随机字符 dbms_random.string(选项,长度);
-- 选项:u 表示大写字母,L表示小写字母,x表示数字和字母混合,p 任意字符
-- 随机生成数字:语法1:dbms_random.value (0,1);
-- dbms_random.value*num; 0到 num 的随机数
-- dbms_random.value(min,max); 生成 min 到 max 随机数
-- 随机数取整:round(dbms_random.value(min,max); 四舍五入
             trunc(dbms_random.value(min,max); 将数字的小数部分截去

7.创建测试表

create table student
(
    sid number(20) not null primary key,
    sname varchar2(20) not null,
    password varchar2(20) not null,
    sex varchar2(20) not null,
    phone varchar2(20)
);

set serverout on
begin
    for i in 1..20 loop
        insert into student(sid,sname,password,sex,phone)
        values(
            1,
            dbms_random.string('u',6),
            dbms_random.string('x',10),
            trunc(dbms_random.value(13000000000,18900000000))
            );
        commit;
    end loop;
end;
/

8.游标

set serverout on
declare
    v_deptno dept.deptno%type:=&p_deptno;
begin
    delete from emp where deptno=v_deptno;
        -- SQL%rowcount 记录删除的行数;如果 rowcount>0,表示已经删除员工。

    if SQL%rowcount>0 then
        -- 再删除部门
        delete from dept where deptno=v_deptno;
        dbms_output.put_line('部门编号为:'||v_deptno||'的部门信息已经删除!');
    else 
        -- 员工数目为空
        dbms_output.put_line('部门编号为:'||v_deptno||'的员工信息已经删除!');
    end if;
end;
/

9.显示游标,查询员工中前10条数据,分别提取 ename,sal

set serverout on
declare
    -- 1.定义游标
    cursor cursor_emp
    is
    select ename,sal from emp where rownum<=10;
    -- 定义两个变量,分别来接受游标提取两列的值
    v_ename emp.ename%type;
    v_sal emp.sal%type;
begin
    -- 2.打开游标
    open cursor_emp;
    -- 3.提取游标内的第一行数据中的两类数据分别赋予两个变量
    fetch cursor_emp into v_ename,v_sal;
    -- 4.循环打印提取游标内容,发现下一行就循环,类似 jdbc
    while cursor_emp%fount loop
        dbms_output.put_line(v_ename||'---'||v_sal);
        -- 改变循环条件,查看是否有下一条数据
        fetch cursor_emp into v_ename,v_sal;
    end loop;
    -- 5.关闭游标
    close cursor_emp;
end;
/

10.使用游标变量来提取部门编号为20的所有员工信息

set serverout on
declare 
    -- 1.定义弱类型游标
        TYPE emp_cursor_type IS REF CURSOR;
( 强类型 REF_CURSOR 返回的数据类型和长度在编译期就应该指明,而弱类型 REF_CURSOR 不需要。)
    -- 2.定义游标类型
    v_cursor_emp EMP_CURSOR_TYPE;
    -- 3.定义游标类型变量的行记录,指的是,游标提取的一条数据中
        的列数和列名和数据库类一致
          v_emp_record emp%ROWTYPE;
begin
    -- 4.打开游标
        open v_cursor_emp for sleect * from emp where deptno=20;
    -- 5.循环提取游标内容
    loop
        -- 5.1 提取游标内容到行记录
        fetch v_cursor_emp into v_emp_record;
        -- 5.2 打印提取的数据
        dbms_output.put_line('ename:'||v_emp_record);
        -- 5.3 定义循环退出条件
        exit when v_cursor_emp%notfound;
    end loop;
    -- 6.关闭游标
    close v_cursor_emp;
end;
/

11. 使用 for 循环提取游标内容

set severout on
declare
    -- 1.定义游标
    cursor cursor_emp
    is
    select ename,sal from emp where rownum<=10;
begin
    -- 自动打开,提取,关闭
        for i in cursor_emp loop
          dbms_output.put_line(i.ename||'---'||i.sal);
        end loop;
end;
/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值