--第一个PL_SQL程序
set serveroutput on;declare
v_s1 varchar2(10) := 'HelloWorld';
v_i number := 1;
begin
dbms_output.put_line(v_s1);
dbms_output.put_line(v_i);
end;
/
/*
在PL_SQL中定义变量,常量,然后给变量,常量赋值
最后在控制台输出常量和变量的值
最后在控制台输出常量和变量的值
*/declare
v_i number := 1;
c_c constant number := 10; --声明常量
begin
v_i := 20;
dbms_output.put_line('i的值是:' || v_i);
end;
/
/*
定义变量v_name,数据类型为varchar2(50),
通过查询员工表,将员工编号为1001的员工的姓名,
使用select into 给v_name赋值,并输出变量的值
*/
declare
v_name varchar2(20) := '小张';
v_name emp.ename%type; --%type:表示获取属性的类型
begin
--查询1001的姓名给v_name赋值
select ename into v_name from emp where empno =7782;
dbms_output.put_line(v_name);
end;
/
/*
使用PL_SQL程序向部门表插入一条记录,然后给部门编号为10的员工工资涨1000块钱
*/
begin
--insert into dept values(50,'文艺部','三楼');
update emp set sal=sal+1000 where empno=7369;
--commit;
end;
--查询EMP表中是否存在记录,存在则显示记录数,否则显示没有记录
declare
v_count number;
begin
select count(empno) into v_count from emp;
if v_count>0 then
dbms_output.put_line('记录数:'||v_count);
else
dbms_output.put_line('没有记录');
end if;
end;
/*
如果“SCOTT”雇员的工资低于 2000 ,就给该员工工资增加 10% 。 -------------作业1
如果该雇员的工资低于 3000 ,就给该员工工资增加 5% 。否则增加 1 %。
*/
select sal from emp where ename='SCOTT';
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where ename='SCOTT';
if v_sal<2000 then
update emp set sal=v_sal*1.1 where ename='SCOTT';
dbms_output.put_line('增加10%'||v_sal);
elsif v_sal<3000 then
update emp set sal=v_sal*1.05 where ename='SCOTT';
dbms_output.put_line('增加5%');
else
update emp set sal=v_sal*1.01 where ename='SCOTT';
end if;
--COMMIT;
end;
--方法2
select sal from emp where ename='SCOTT';
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where ename='SCOTT';
if v_sal<2000 then
update emp set sal=v_sal*1.1 where ename='SCOTT';
dbms_output.put_line('增加10%'||v_sal);
elsif v_sal<3000 then
update emp set sal=v_sal*1.05 where ename='SCOTT';
dbms_output.put_line('增加5%');
else
update emp set sal=v_sal*1.01 where ename='SCOTT';
end if;
--COMMIT;
end;
----------------------------------------------------------------------------------------------------------------------
declare
v_count number;
begin
select count(empno) into v_count from emp;
case
when v_count>0 then
dbms_output.put_line('记录数:'||v_count);
else
dbms_output.put_line('没有记录');
end case;
end;
declare
v_num number := 1001;
v_name emp.ename%type;
begin
loop
if v_num>1005 then
exit; --不满足条件时,退出循环
end if;
select ename into v_name from emp where empno=v_num;
dbms_output.put_line('姓名:'||v_name);
v_num :=v_num + 1;
end loop;
end;
--使用无条件循环向部门表中插入10万条记录,编号从100开始
declare
v_num dept.deptno%type := 60;
begin
loop
if v_num>71 then
exit; --不满足条件时,退出循环
end if;
insert into dept values(v_num ,'文艺部','三楼');
v_num := v_num + 1;
end loop;
end;
/*
使用while循环向部门表中插入10万条记录,编号从100开始
*/
declare
v_num number := 100;
begin
while v_num<100100 loop
insert into dept values(v_num ,'文艺部','三楼');
v_num := v_num+1;
end loop;
commit;
end;
--使用for循环将部门表中编号从100到100100的记录删除
declare
v_num number;
begin
for v_num in 61 .. 71 loop
delete from dept where deptno=v_num;
end loop;
end;
/*
找出员工表中工资第二大的员工 ---------------------------作业2
*/select * from emp order by sal desc;
select rownum as rn,e.* from emp e where sal = (
select max(sal) from emp where sal<>(
select max(sal) from emp));
-----------------------------------------------------------------------------------------------------------------
declare
--v_empno emp.empno%type;
v_ename emp.ename%type;
v_maxsal emp.sal%type;
v_msal emp.sal%type;
v_count number;
v_i number := 1;
v_rn number;
begin
select max(sal) into v_maxsal from emp;
dbms_output.put_line('最大成绩:'||v_maxsal);
select max(sal) into v_msal from emp where sal <> v_maxsal;
dbms_output.put_line('次大成绩:'||v_msal);
select count(*) into v_count from emp where sal = v_msal;
for v_i in 1 .. v_count loop
--PL_SQL与SQL语句的嵌套
select ename into v_ename from(select rownum as rn, ename from emp where sal = v_msal) where rn = v_i;
dbms_output.put_line('姓名'||v_ename);
end loop;
end;
-----------方法2
declare
v_empno emp.empno%type;
v_ename emp.ename%type;
v_max emp.sal%type;
v_second emp.sal%type;
v_count number;
v_i number;
v_temple number;
begin
select count(*) from v_count from emp;
v_max:=0;
v_second:=0;
for v_i in 1 .. v_count loop
select sal into v_tempsal from (select rownum as rw,e.* from emp e) where rw = v_i;
if v_tempsal > v_max then
v_second := v_max;
v_max :=v_temple;
elsif v_templ
end;
--------------------------------------------------------------
declare
v_i number := 1;
begin
if v_i = 1 then
dbms_output.put_line('aaaaaa'); --不能为空
else
dbms_output.put_line('bbbbbbb');
end if;
end;
-------------------------------------------------- 异常------------------------------------------------------------------------
--向员工表插入1001记录,如果违反唯一约束添加,使用非预定义异常输出错误信息
declare
--声明一个异常对象
err_pk exception;
--通知编译器使用exception_init()将异常对象与oracle错误代码绑定
pragma exception_init(err_pk,-00001);
begin
insert into emp(empno,ename) values(1111,'2222');
exception
when err_pk then
dbms_output.put_line('插入重复记录,请重新插入');
commit;
end;
---自定义异常
--查询‘SCOTT’的工资,如果工资小于10000,使用自定义异常,输出异常信息declare
err_sal exception; --声明异常对象
v_sal number;
begin
select sal into v_sal from emp where ename = 'SCOTT';
if v_sal<10000 then
raise err_sal; --抛出异常对象
end if;
exception
when err_sal then
dbms_output.put_line('工资太低了,该涨工资了');
end;