一.简单说块
- 如果想知道哪里出错:
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. /