Oracle 原理: PL/SQL基础

一、PL/SQL 功能和特点

 PL/SQL 是过程语言(Procedural Language)和结构化查询(SQL)语言结合而成的编程语言;PL/SQL是SQL的扩展,支持大对象、集合类型。还可以给SQL语言增加程序逻辑。支持SQL,在PL/SQL种可以使用:数据操纵命令、事物控制命令、游标控制、SQL函数和SQL运算符。PL/SQL有更佳的性能,当用户把PL/SQL块发送到服务器端,由Oracle服务器端编译、运行、再把结果返回给用户,可以移植性,可执行在任何操作系统上。PL/SQL可以通过存储过程限制对用户的访问来提高安全性。

  Oracle服务器中有PL/SQL引擎 和 SQL引擎 ,PL/SQL引擎执行 for ,if 等过程语句 , 而SQL引擎执行 insert、delete等SQL语句

PL/SQL分为三个部分,声明部分、可执行部分、异常处理部分,其中可执行部分是必须要有的。

DECLARE
--声明变量在这里写
BEGIN
--过程程序在这里写
EXCEPTION
--异常处理在这里写
END;

二、Oracle 11g的PL/SQL对序列的改进,即无dual序列的使用

----创建一个序列 seq ----
create sequence seq start with 1 increment by 1;
----SQL语句的序列取值必须用select -----
select seq.nextval from dual ;
----过程语句不需要select 也可以进行序列取值
declare 
 se positive ; --正整数
begin
  se :=seq.nextval ;
  -- select seq.nextval into se from dual ;
  dbms_output.put_line(se);   
 end;
/
drop sequence seq;

三、控制语句和continue语句

条件判断语句: if ..then    ;    if..then..else; if..then.elsif..;   case  语句;

循环语句: Loop  [无条件循环内容 ] end loop ;    while [循环条件] loop [循环内容] end loop;   

                  for [循环体变量] in [循环体变量的取值范围]  loop  [循环内容]  end loop;

注: Loop  [无条件循环内容 ] end loop 通常和exit搭配,相当于JAVA的break ,如果没有控制语句搭配,相当于无限循环。

     continue; 直接进入下一个循环;

在PL过程语句中是不能使用DDL语句的,即create、drop、truncate等操作。想要用DDL语句必须用动态SQL执行:

execute immediate sql_command [into 执行结果集][using 绑定变量集 ]

---可重跑的SQL脚本:创建并初始化表示例------
declare
 sql_command varchar2(500);
 isExsit number ;
begin
  select count(1) into isExsit from user_tables where table_name ='SALARY_TBL'; 
  if isExsit <> 0  then 
    sql_command :='truncate table salary_tbl';
    execute immediate sql_command;
    sql_command :='drop table salary_tbl';
    execute immediate sql_command;
  end if;
  sql_command := '  
create  table salary_tbl(
   employer_nm varchar(20),
   department varchar(20) not null,
   salary number not null,
   leader_nm varchar(20)
)';
 execute immediate sql_command;
 for i in  1..13000
     loop
     insert into salary_tbl values('雇佣者'||i,'部门'||Mod(i,50),100+sqrt(i),'雇佣者'||Mod(i,20)); 
     if Mod(i,1000)=0 then 
       commit;
     end if;
   end loop;
 commit;
end; 
/

---goto 语句示例

declare
 sql_command varchar2(500);
 isExsit number ;
 i number := 1;
begin
  select count(1) into isExsit from user_tables where table_name ='SALARY_TBL'; 
  if isExsit <> 0  then 
    sql_command :='truncate table salary_tbl';
    execute immediate sql_command;
    sql_command :='drop table salary_tbl';
    execute immediate sql_command;
  end if;  
  sql_command := '  
create  table salary_tbl(
   employer_nm varchar(20),
   department varchar(20) not null,
   salary number not null,
   leader_nm varchar(20)
)';
 execute immediate sql_command;
 <<code_aa>>    -
     insert into salary_tbl values('雇佣者'||i,'部门'||Mod(i,50),100+sqrt(i),'雇佣者'||Mod(i,20)); 
      if Mod(i,1000)=0 then 
       commit;
     end if;
     i :=i+1;
     if i <13000 then 
       goto code_bb;
     else 
       goto code_aa;
     end if ;   
   <<code_bb>> 
 commit;
end; 
/

四,Oracle11g 中的错误处理

异常分为预定义异常和用户自定义异常。预定义异常就是系统自带的异常,而用户自定义异常(raise)是自己声明的相当于java的throw。

预定义异常  exception  when [异常名] then ... when [异常名2 ] then ...  

raise_application_error (异常编号异常信息)  即异常中断程序并输出异常信息

declare 
 department varchar(20) := '';
 nullinserterror1 exception;
begin
   if department is null then
     raise nullinserterror1;
   end if;
   insert into salary_tbl values('雇佣者9999',department,100,'雇佣者4'); 
exception 
   when nullinserterror1   then
     dbms_output.put_line('自定义空值插入异常');
     raise_application_error (-20001,'空值异常');
end;
/

在输出结果中显示

猜你喜欢

转载自blog.csdn.net/superSmart_Dong/article/details/106744970