马士兵老师oracle视频学习笔记(六)

在PL_SQL里面写DDL语句:
begin
execute immediate 'create table T (nnn varcahr2(20) default ''aaa'')'; --因为里面有单引号,所以里面需要一个单引号的地方要用两个单引号转义
end;
if语句:
--取出7369的薪水。如果小于1200,则输出'low',如果小于2000则输出'middle',否则输出'hign'
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno = 7369;
if(v_sal < 1200) then dbms_output.put_line('low');
elsif(v_sal < 2000) then --注意这个坑爹的elsif啊,这个中间没有空格没有e啊。 dbms_output.put_line('middle'); else --else后面没有then       dbms_output.put_line('hign');
      end if;
end;
--取出7839的薪水。如果小于2000,则给他的薪水乘以2,如果大于2000则给他的薪水除以2,否则输出薪水
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno = 7839;
if(v_sal < 2000) then
    update emp set sal=v_sal*2;
    elsif(v_sal > 2000) then
    update emp set sal=v_sal/2;
else
                      dbms_output.put_line(v_sal );
end if;
end;
循环:
--第一种:输出1-10的数字,类似于java的do-while循环
declare
i binary_integer := 1;
begin
loop
dbms_output.put_line(i);
i := i + 1;
exit when(i >= 11);
end loop;
end;
--第二种:输出1-10的数字,类似于java的while循环
declare
j binary_integer := 1;
begin
while j < 11 loop
dbms_output.put_line(j);
j := j + 1;
end loop;
end;
--第三种:输出1-10的数字,类似于java的for循环
begin
     for k in 1..10 loop --当k的值位于1--10之间
      dbms_output.put_line(k);
end loop;
end;
--输出10-1的数字
begin
for k in reverse 1..10 loop --reverse意思是逆序
dbms_output.put_line(k);
end loop;
end;
错误处理:
--too_many_rows异常
declare
v_temp number(4);
begin
select empno into v_temp from emp where deptno = 10;
exception
when too_many_rows then
dbms_output.put_line('太多记录了');
when others then --抓到其他异常的时候
dbms_output.put_line('error');
end;
--no_data_found异常
declare
v_temp number(4);
begin
select empno into v_temp from emp where deptno = 2222;
exception
when no_data_found then
dbms_output.put_line('没数据');
when others then
dbms_output.put_line('error');
end;
常见的处理错误的做法:
--先创建一张存放错误信息的表
create table errorlog(
id number primary key,
errcode number,
errmsg varchar2(1024),
errdate date
);
--建一个序列
create sequence seq_errorlog_id start with 1 increment by 1;
--写一个存储过程操作这张表
declare
v_deptno dept.deptno%type := 10; --deptno被emp表引用着,所以在这删不掉
v_errcode number;
v_errmsg varchar2(1024);
begin
delete from dept where deptno = v_deptno;
commit;
exception
when others then
rollback;
v_errcode := SQLCODE;--SQLCODE是个关键字,代表的就是出错的代码,一般都是负值
v_errmsg := SQLERRM; --SQLERRM是个关键字,代表的就是出错的信息
insert into errorlog values (seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate);
commit;
end;

你可能感兴趣的:(oracle,sql)