pl/sql我的笔记

一.简单说块

  • 如果想知道哪里出错:
show error;
  • 创建一个表,并创建过程
1.	create table mytest(name varchar2(30),passwd varchar2(30));
2.	create or replace procedure my_pro1 is  
3.	begin   
4.	insert into mytest values('WHY','m1234');   
5.	end;
6.      \
  • 调用该进程

1)exec 过程名(参数值1,参数值2...);

2)call 过程名(参数值1,参数值2...);

每写一次调用进程语句,就会在mytest表中添加一项WHY

exec my_pro1;
  • pl/sql最基本程序单元

块=过程(存储过程)+函数+触发器+包

  • 块的基本构成

定义部分,执行部分,例外处理部分:
declare
/*定义部分——定义常量、变量、游标、例外、复杂数据类型*/
begin
/*执行部分——要执行的pl/sql语句和sql语句*/
exception
/*例外处理部分——处理运行的各种错误*/
end;
定义部分是从declare开始的,该部分是可选的;
执行部分是从begin开始的,该部分是必须的;
例外处理部分是从exception开始的,该部分是可选的。

  • dbms_output.put_line('hello'); 中dbms是一个包,put_line是包下面的函数
dbms_output.put_line('用户名是'||v_name||'工资是'||v_sal);

二.过程

  • 创建过程:
create procedure my_pro2(my_name varchar2,newsal number) is

块中定义变量在declare与begin之间,过程定义变量在is和begin之间

三.控制结构

  • 条件分支语句

if....then;if....then....else;if....then....elsif....else....

简单的条件判断 if – then 
问题:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该员工工资增加10%。

1.	create or replace procedure sp_pro6(spName varchar2) is  
2.	--定义   
3.	v_sal emp.sal%type;   
4.	begin  
5.	    --执行   
6.	    select sal into v_sal from emp where ename=spName;   
7.	    --判断   
8.	    if v_sal<2000 then  
9.	        update emp set sal=sal+sal*10% where ename=spName;   
10.	    end if;   
11.	end;   
12.	/  
二重条件分支 if – then – else 
编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0就在原来的基础上增加100;如果补助为0就把补助设为200;
1.	create or replace procedure sp_pro6(spName varchar2) is  
2.	--定义   
3.	v_comm emp.comm%type;   
4.	begin  
5.	    --执行   
6.	    select comm into v_comm from emp where ename=spName;   
7.	    --判断   
8.	    if v_comm<>0 then  
//pl/sql中不等于是'<>'
9.	        update emp set comm=comm+100 where ename=spName;   
10.	    else  
11.	        update emp set comm=comm+200 where ename=spName;   
12.	    end if;   
13.	end;   
14.	/  

exec sp_pre6('SCOTT');
//名字必须大写
多重条件分支 if – then – elsif – then 
问题:编写一个过程,可以输入一个雇员编号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,如果该雇员的职位是MANAGER就给他的工资增加500,其它职位的雇员工资增加200。 
Sql代码  
1.	create or replace procedure sp_pro6(spNo number) is  
2.	    --定义   
3.	    v_job emp.job%type;   
4.	begin  
5.	    --执行   
6.	    select job into v_job from emp where empno=spNo;   
7.	    if v_job='PRESIDENT' then  
8.	        update emp set sal=sal+1000 where empno=spNo;   
9.	    elsif v_job='MANAGER' then  
10.	        update emp set sal=sal+500 where empno=spNo;   
11.	    else  
12.	        update emp set sal=sal+200 where empno=spNo;   
13.	    end if;   
14.	end;   
15.	/  

exec sp_pre6(7839);

 

  • 四.loop循环
  • 以loop开头,endloop结尾,至少循环一次
案例:现有一张表users,表结构如下: 
用户id | 用户名 
       | 
请编写一个过程,可以输入用户名,并循环添加10个用户到users表中,用户编号从1开始增加。 
Sql代码  
1.	create or replace procedure sp_pro6(spName varchar2) is  
2.	--定义  :=表示赋值   
3.	    v_num number:=1;       
4.	begin  
5.	    loop   
6.	        insert into users values(v_num,spName);   
7.	        --判断是否要退出循环   
8.	        exit when v_num=10;   
9.	        --自增   
10.	        v_num:=v_num+1;   
11.	    end loop;   
12.	end;   
13.	/  

五.while循环

基本循环至少要执行循环体一次,而对于while循环来说,只有条件为true时,才会执行循环体语句,while循环以while...loop开始,以end loop结束。while先判断,再决定循不循环,loop直接先循环 

  • 
    案例:现有一张表users,表结构如下: 
    用户id ||用户名 
    
    问题:请编写一个过程,可以输入用户名,并循环添加10个用户到users表中,用户编号从11开始增加。 
    Sql代码  
    1.	create or replace procedure sp_pro6(spName varchar2) is  
    2.	--定义  :=表示赋值   
    3.	    v_num number:=11;       
    4.	begin  
    5.	    while v_num<=20 loop   
    6.	    --执行   
    7.	       insert into users values(v_num,spName);   
    8.	       v_num:=v_num+1;   
    9.	    end loop;   
    10.	end;   
    11.	/  
    

猜你喜欢

转载自blog.csdn.net/qq_42420263/article/details/83117070
今日推荐