---------------------------------------------------------------------------
程序块中使用 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;
------------------------------------------------------