PL编程基础

来源:互联网 发布:什么软件可以算命 编辑:程序博客网 时间:2024/06/06 16:43

1,块(编程):

存储过程  触发器   函数   包

2命名规范:

定义变量:建议 v_ 作为前缀 如:v_name ;

定义常量:建议c_作为前缀 如:c_num;

定义游标:建议 _cursor最为后缀 如:emp_cursor;

定义例外:建议e_最为前缀 如:e_notData;

,3,块编程:

·定义部分 

·执行部分

·异常处理部分

declare 

--定义常量,变量,游标,复杂数据类型。。

begin

-- 执行部分

exception

-- 异常处理部分

end;

set serveroutput on ; -- 打开输出选项

才可以输出:dbms_output.put_line(.....);

4,复杂数据类型

|- %type  --对于一个字段的类型

--%type的数据类型
declare 
--定义类型和emp表中的ename字段的类型一样,
---这样就可以不需要知道ename的类型才来定义变量了
v_ename emp.ename%type; 
begin
     select ename into v_ename from emp where empno = 7788;
     dbms_output.put_line(v_ename);
end;

|- %rowtype  -- 对于一个表一条完整的记录的类型

--%rowtype的复杂数据类型
declare
--%rowtype是针对一张表的所有的字段
v_empInfo emp%rowtype; 
begin
     select * into v_empInfo from emp where empno=7788;
     dbms_output.put_line('名字:'|| v_empInfo.ename|| ', 工作:' || v_empInfo.job);
end;

|- is  record -- 类似于高级语言的结构体

--多个字段,并非一张表的全部字段
declare 
--先要定义这种类型的数据包括哪几个字段信息  type .. is record ..
type v_emp_rcType is record(v_ename emp.ename%type , v_job emp.job%type);
--还要将这个类型赋值给一个变量
v_emp_info v_emp_rcType;
begin
     select ename,job into v_emp_info from emp where empno=7788;
     --要得到这种类型里面的某一个字段,就可以 "刚才被赋予这种类型的变量.定义时候的参数"
     dbms_output.put_line('名字:'|| v_emp_info.v_ename|| ', 工作:' || v_emp_info.v_job);
end;

|- is table of -- 类似于数组

|- cursor  --游标

                   declare
   type v_emp_cursor is ref cursor; -- 定义一个游标
   v_emps v_emp_cursor;  -- 给游标赋值给变量
   v_ename emp.ename%type;
begin
      --打开游标
      open v_emps for select ename from emp;
      loop 
           fetch v_emps into v_ename; -- 取出右边的数据
           exit when v_emps%notfound ; -- 退出循环的条件,当游标已经是最后一行了
           dbms_output.put_line(v_ename);
      end loop;
      close v_emps;--关闭游标
end ;

注意:在PL编程中, 是比较的意思 , 要给变量赋值 :=  如: 赋值常量 c_num number:=5 ; 运算的时候赋值 v_n := v_n +1 ;


5,语法:

条件语句

|- if--then --- end if;

|- if-- then --else -- end if;

create or replace procedure sp_pcd_2(empname varchar2) is

v_comm emp.comm%type;

begin

     select comm into v_comm from emp where ename = empname;

     if nvl(v_comm,0)!=0 then-- 也可以是<>

        update emp set comm = nvl(v_comm,0) + 100 where ename = empname;

     else

        update emp set comm = nvl(v_comm,0) + 150 where ename = empname;

     end if;

end;

|- if-- then -- elsif -- then -- end if;

create or replace procedure sp_pcd_3(empname varchar2) is

v_comm emp.comm%type;

begin

     select comm into v_comm from emp where ename = empname;

     if nvl(v_comm,0) < 50 then

        update emp set comm = nvl(v_comm,0) + 100 where ename = empname;

     elsif nvl(v_comm,0) between 50 and 100 then

        update emp set comm = nvl(v_comm,0) + 50 where ename = empname;

     else

        update emp set comm = nvl(v_comm,0) + 10 where ename = empname;

     end if;

end;

|- case--when -- then --else--end case;

== 运用在sql 语句中

select ename,job,case

  2  when sal > 2000 then '有钱'

  3  when sal between 1000 and 2000 then '一般'

  4  else ''

  5  end case

  6  from emp;

==过程语言中

declare
v_num number:= 10;
v_rs  number(5);
begin
     case mod(v_num,2)  -- 这个表达式是可选的
     when 0 then v_rs:=1-- 后面要记得加个 ;
     when 1 then v_rs:=5;
     when 2 then v_rs:=8;
     else
         v_rs := 0 ;
     end case;
    
    dbms_output.put_line(v_rs);
end;

循环语句

|- loop -- exit when -- end loop;

declare
type v_emp_cursor is ref cursor; -- 定义一个游标
v_emps v_emp_cursor;  -- 给游标赋值给变量
v_ename emp.ename%type;
begin
     --打开游标
     open v_emps for select ename from emp;
     loop 
          fetch v_emps into v_ename; -- 取出右边的数据
          exit when v_emps%notfound ; -- 退出循环的条件,当游标已经是最后一行了
          dbms_output.put_line(v_ename);
     end loop;
     close v_emps;--关闭游标
end;

|- while -- loop -- end loop;

create or replace procedure sp_pcd_5(tname varchar2) is

v_n number:= 16;

v_name varchar(30);

begin

     while v_n < 20 loop --条件

          v_name:=tname||v_n;

          insert into test values(test_id.nextval,v_name);

          v_n := v_n+1;-- := 切记

     end loop;

end;

|- for - in - loop -- end loop;

begin
     for i in 1..5  loop
         dbms_output.put_line(i);
     end loop;
end;

控制语句

null :

goto :

create or replace procedure sp_pcd_6(deptnum number) is -- 声明变量在is begin中间

type test_cursor_type is ref cursor;

sals_cursor test_cursor_type;

v_sal emp.sal%type;

v_empno emp.empno%type;

begin

     open sals_cursor for select sal,empno from emp where deptno = deptnum;

     <<agin>>

     loop

         fetch sals_cursor into v_sal,v_empno;

         if v_sal < 1000 then

         update emp set sal = sal + 200 where empno = v_empno;

         elsif v_sal between 1000 and 1500 then

         null; -- 什么都不执行,提高代码的可读性

         else

         goto agin; -- 跳到上面<< agin>>上面去

         end if;

         exit when sals_cursor%notfound ;

     end loop;

end;

原创粉丝点击