oracle数据库——plsql基本语法 流程控制及练习 循环结构

本文介绍了Oracle数据库中的PL/SQL基本语法,强调了流程控制和循环结构的重要性。通过示例讲解了LOOP、WHILE和FOR三种循环结构的用法,并提供了相关练习,帮助读者掌握如何使用PL/SQL输出金字塔和九九乘法表。

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

  1. plsql基本语法
    plsql 就是在sql语句中增加了变量,流程控制,函数,使得sql语句具有更强大的功能
    基本结构:

     declare
     定义变量
     begin
     select * from 表;--执行会报错,可以增删改,但查的时候要用into
     select xxx into v_xxx from 表 where xxx;
     end;
    

emp%rowtype 行类型
emp.sal%type 和emp表中sal列的类型一样
record 记录集类型

例如:

直接赋值
  declare 
    v_name varchar2(50);
  begin
     v_name:='熊二';
     dbms_output.put_line(v_name);
  end;
  
  用'/'来执行

  打开输出功能:
set serveroutput on;

根据查询结果来赋值
declare 
    v_name varchar2(50);
  begin
     select ename into v_name from emp where empno=7782;
     dbms_output.put_line(v_name);
  end;

  根据键盘输入来赋值
  declare 
    v_name varchar2(50);
  begin
     v_name:='&输入姓名';
     dbms_output.put_line(v_name);
  end;
  
  
  输入部门编号,查询部门工资最高的员工姓名和职位
  declare 
    v_deptno number(5);
    v_ename varchar2(20);
    v_job varchar2(30);
  begin
     v_deptno:=&输入部门编号;
     select ename,job  into v_ename,v_job from emp where sal=
     (
         select max(sal) from emp where deptno=v_deptno
     );
     dbms_output.put_line(v_deptno||'部门工资最高的员工是:'||v_ename||'  职位:'||v_job);
  end;
  

  
  根据员工编号去查名字
写法1:
   declare 
    v_name varchar2(50);
  begin
     select ename into v_name from emp where empno=&empno;
     dbms_output.put_line(v_name);
  end;
  
  写法2:
参照某一列的数据类型去定义数据类型
   declare 
    v_name emp.ename%type;
  begin
     select ename into v_name from emp where empno=&empno;
     dbms_output.put_line(v_name);
  end;
  
  参照某一行的数据类型,有多少列就定义多少变量
  declare 
     v_emprow emp%rowtype;
   begin
   select * into v_emprow from emp where empno=&empno;
   dbms_output.put_line(v_emprow.ename || v_emprow.job);
   end;
  
  
   定义一个数据类型,参照其他表中的数据类型
  declare 
     type MyType is record
     (
         t_empno emp.empno%type,
         t_ename emp.ename%type,
         t_job emp.job%type,
         t_sal emp.sal%type
     );
     v_emprow MyType;
   begin
   select empno,ename,job,sal into v_emprow from emp where empno=&empno;
   dbms_output.put_line(v_emprow.t_ename || v_emprow.t_job);
   end;

2.流程控制

--if..else..
declare 
      v_job emp.job%type;
   begin
       select job into v_job from emp where empno=&empno; 
       if v_job='MANAGER' then
          dbms_output.put_line('是经理');
       else
          dbms_output.put_line('不是经理');
       end if;
   end;
--if..elsif..else..   
declare 
     v_sal emp.sal%type;
   begin
      select sal into v_sal from emp where empno=&no;
      if v_sal <=1000 then
         dbms_output.put_line('蓝领');
       elsif v_sal <=2000 then
         dbms_output.put_line('白领');
       else
         dbms_output.put_line('金领');
       end if;
      end;


--case等值

declare 
       v_job emp.job%type;
      begin
          select job into v_job from emp where empno=&no;
          case
            v_job
          when 'CLERK' then   dbms_output.put_line('科员');
          when 'ANALYST' then   dbms_output.put_line('分析师');
          when 'SALESMAN' then   dbms_output.put_line('销售员');
          when 'MANAGER' then   dbms_output.put_line('经理');
          when 'PRESIDENT' then   dbms_output.put_line('董事长');
          else dbms_output.put_line('不明职位');
          end case; 
      end;
   
   
 --case条件
    declare 
     v_sal emp.sal%type;
   begin
      select sal into v_sal from emp where empno=&no;
        case
          when v_sal>=3000 then dbms_output.put_line('金领');
          when v_sal>=2000 then dbms_output.put_line('白领');
          when v_sal>=1000 then dbms_output.put_line('蓝领');
           else dbms_output.put_line('无领');
        end case;        
      end;

练习

1.输入员工编号,如果工资高于他所在部门的平均工资,输出工资较高,否则输出工资较低   
declare
v_sal emp.sal%type;
v_deptno emp.deptno%type;
v_avgsal emp.sal%type;
begin
  select sal,deptno into v_sal,v_deptno from emp where empno=&no;
  select avg(sal) into v_sal from emp where deptno=v_deptno;
  dbms_output.put_line(v_sal||''||v_avgsal);
  if v_sal < v_avgsal then dbms_output.put_line('工资较低');
  else dbms_output.put_line('工资较高');
  end if;
  end;

方法2:
declare
v_sal emp.sal%type;
v_empno emp.empno%type;
v_avgsal emp.sal%type;
begin
  v_empno:=&empno;
select sal into v_sal from emp where empno=v_empno;
select avg(sal) into v_avgsal from emp where deptno= 
(
select deptno from emp where empno=v_empno
);
 if v_sal < v_avgsal then dbms_output.put_line('工资较低');
  else dbms_output.put_line('工资较高');
  end if;
end;
2.输入一个员工编号,输出他入职的季节

declare
v_hiredate emp.hiredate%type;
v_month number(4);
begin
select hiredate into v_hiredate from emp where empno=&no;
select to_number(to_char(v_hiredate,'mm')) into v_month from dual;
case 
when v_month >3 and v_month<6 then dbms_output.put_line('春');
when v_month >6 and v_month<9 then dbms_output.put_line('夏');
when v_month >9 and v_month<12 then dbms_output.put_line('秋');
else dbms_output.put_line('冬');
end case;
end;


方法2:
declare
v_month number(4);
begin
select to_number(to_char(hiredate,'mm')) into v_month from emp where empno=&no;
case 
when v_month between 1 and 3 then dbms_output.put_line('春');
when v_month between 4 and 6 then dbms_output.put_line('夏');
when v_month between 7 and 9 then dbms_output.put_line('秋');
when v_month between 10 and 12 then dbms_output.put_line('冬');
end case;
end;

3.循环结构
3.1.loop
语法:
LOOP
语句;
EXIT WHEN <条件>
END LOOP;

--输出1到10
declare
v_i number(5);
begin
v_i:=1;
loop
dbms_output.put_line(v_i);
v_i:=v_i+1;
exit when v_i>10;
end loop;
end;
--如果要使用put不换行的输出,要结合put_line,否则可能看不到输出结果
declare
v_i number(5);
begin
v_i:=1;
loop
dbms_output.put(v_i);
v_i:=v_i+1;
exit when v_i>10;
end loop;
dbms_output.put_line(' ');
end;

3.2.WHILE LOOP
语法:
WHILE <条件>
LOOP
语句;
END LOOP;

--与loop不同的是while loop把循环条件放到前面来
declare
v_i number(5);
begin
v_i:=1;
while v_i<=10 loop
dbms_output.put_line(v_i);
v_i:=v_i+1;
end loop;
end;

3.3.FOR
语法:
FOR <循环变量> IN 下限…上限
LOOP
语句;
END LOOP;

--从1循环到10
--当不需要定义变量时可以不写declare
begin
for v_i in 1 .. 10
loop
dbms_output.put(v_i);
end loop;
dbms_output.put_line('');
end;

练习:

--输出九九乘法表

begin
  for v_i in 1 .. 9
    loop
    for v_j in 1 .. v_i
      loop
        dbms_output.put(v_i||'*'||v_j||'='||v_i*v_j||' ');
        end loop;
        dbms_output.put_line('');
        end loop;
        end;
  

--输出金字塔

               *
              ***
             *****
            *******
           *********
          ***********
 begin
 for v_i in 1 .. 6 loop
 dbms_output.put_line(lpad(lpad('*',2*v_i-1,'*'),6+v_i,' '));         
 end loop;         
 end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值