plsql笔记(判断)
2026/8/25 12:08:00 网站建设 项目流程

---------------------------------------------------------------------------
程序块中使用 DML 语句

可以再加一个关键词

returning 列名1,列名2.... into 变量1,变量2......

--将 DML 语句 影响的列的值 返回交给变量
--------还是只能处理单行数据

---------returning 就是能得到返回值 可以不写


语法

declare

begin
DML语句 returning 列名1,列名2.... into 变量1,变量2...... ;

end;

应用在 insert 语句中

例题 向emp表中插入一行数据

declare
V_ename emp.ename%type;


begin
insert into emp(empno,ename)
values(9999,'秦月') returning ename into V_ename;

dbms_output.put_line(V_ename);

end;

select * from emp

----在 insert 语句中 returning 是 将 插入的值交给变量


declare
V_ename emp.ename%type;
v_empno number;

begin
insert into emp(empno,ename)
values(9999,'秦月') returning ename,empno into V_ename,v_empno;

dbms_output.put_line(V_ename||v_empno);

end;


declare
V_ename emp.ename%type;
v_empno number;
v_sal number;
V_job varchar2(20);
begin
insert into emp(empno,ename)
values(9999,'秦月')
returning ename,empno,sal,job into V_ename,v_empno,V_sal,V_job;

dbms_output.put_line(V_ename||v_empno||V_sal||V_job);

end;

delete 语句 使用 returning into


declare
V_ename varchar2(20);
begin
delete from emp where empno=8888 returning ename into V_ename;
dbms_output.put_line(V_ename);

end;

select * from emp


---- 当 delete 的时候 returning 是将删除的数据 交给变量

update -----??? 注意 只能修改一行数据

declare
V_sal number;
begin
update emp set sal=2 where empno=6666 returning sal into V_sal;

dbms_output.put_line(V_sal);

end;

----update returning 得到的是修改后的值


-----------------------------------------------------------

DDL 语句在程序块中的使用


-----可以通过 动态 sql 来实现 DDL 语句

动态 sql :是将 sql语句用 单引号包裹 交给变量

语法

declare
变量名 varchar2(300); ------------------1. 声明变量
.....
begin
变量名 := 'sql语句'; --------------------2. 给变量赋值 --定义动态sql

------------sql语句 必须是能执行的sql语句交给变量

execute immediate 变量名 --------------------3. 立即执行 动态sql
[ into 变量1,变量2 .... ]; ----将执行的结果 交给变量

end;

例题 利用 动态sql 实现 drop 删除表

declare
v_sql varchar2(400); ------------------1. 声明变量

begin
V_sql := 'drop table emp2'; -------------2. 定义动态sql

execute immediate V_sql ; --------------3. 立即执行动态sql


end;

select * from emp2


练习 用动态sql 实现创建 表

declare
V_sql varchar2(500);

begin
V_sql :='create table zy972(zno number,zname varchar2(30))';

execute immediate V_sql;

end;


create table zy972(zno number,zname varchar2(30))

select * from zy972

declare
V_sql varchar2(500);

begin
V_sql :='c'||'reate '||' table zy973(zno number,zname varchar2(30))';

execute immediate V_sql;

end;


create table zy973(zno number,zname varchar2(30))


------------------------------------------------------------
例题 传入一个表名 输出该表的记录数

declare
V_table varchar2(20):='&请输入';
V_count number;
V_sql varchar2(500); ---------------------1

begin
V_sql := 'select count(1) from '||v_table; ----------2

dbms_output.put_line(V_sql);

execute immediate V_sql into V_count; -------------3


dbms_output.put_line(V_count);

end;

------------------------------------------------------------------------------


***********************************************************
********************************************************
******************************************************************
判断----核心

if判断 -----分支判断

语法

declare


begin
if 条件1.............. ----判断的开始
then 结果1 -----------------------------满足条件1 要执行的结果1

elsif 条件2............
then 结果2 -----------------------------满足条件2 要执行的结果2

elsif 条件3............
then 结果3 -----------------------------满足条件3 要执行的结果3

elsif 条件4............
then 结果4 -----------------------------满足条件4 要执行的结果4

...............................................

[else 其他结果] ----当没有满足以上所有条件 要执行的结果

end if ; -----判断的结束

end;


-----注意 当满足了其中一个条件 就要执行对应的结果, 然后执行 end if 结束判断

例题 传入一个数值 判断数值的大小 如果 1-10 则输出 小于等于10
11-20 小于等于20
.......................


declare
n number:='&请输入';

begin
if n between 1 and 10
then
dbms_output.put_line('小于等于10');

elsif n between 11 and 20
then
dbms_output.put_line('小于等于20');

elsif n between 21 and 30
then
dbms_output.put_line('小于等于30');

else
dbms_output.put_line('大于30');

end if;

end;


练习 1. 传入一个员工编号 如果该员工的工资在 1-1000 则打印输出小于等于1000
1001-2000 小于等于2000
2001-3000.....
..................

declare
V_empno number:='&请输入';
V_sal number;

begin
select sal into V_sal from emp where empno=V_empno;


if v_sal between 1 and 1000
then
dbms_output.put_line('小于等于1000');
elsif v_sal between 1001 and 2000
then
dbms_output.put_line('小于等于2000');
else
dbms_output.put_line('大于2000');



end if ;

end;


declare
V_sal emp.sal%type;
V_empno emp.empno%type := '&员工编号';
begin
select sal into V_sal from emp where empno=V_empno;



if V_sal between 1 and 1000
then dbms_output.put_line('小于等于1000');
elsif V_sal between 1001 and 2000
then dbms_output.put_line('小于等于2000');
else
dbms_output.put_line('大于2000');
end if;
end;

练习

传入一个员工编号 如果该员工的工资 高于所在部门的平均工资 则降薪 200 --update
工资 小于所在部门的平均工资 则涨薪 200 --update
否则 薪资 不变--update

并且 打印输出 涨薪前 后的薪资


declare
v_empno number:='&请输入';
V_sal number;
V_deptno number;
V_avg number;
V_sal1 number;
begin
select sal ,deptno into V_sal,V_deptno from emp where empno=V_empno;

select avg(sal) into V_avg from emp where deptno =v_deptno;

if V_sal>v_avg then
update emp set sal = sal-200 where empno=V_empno returning sal into V_sal1;
elsif V_sal<v_avg then
update emp set sal=sal+200 where empno=V_empno returning sal into V_sal1;

else
update emp set sal=sal where empno=v_empno returning sal into V_sal1;

end if ;


dbms_output.put_line(V_sal||V_sal1);

end;

------------------------------------------------------

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询