1.一个完整的pl/sql块的结构
declare
Declarations
begin
Excutable Code
exception
Exceptional handlers
end;
①定义部分
定义部分以关键字declare为标识从declare开始到begin结束。以此主要定义要使用的常量、变量、数据类型、游标、异常处理名称等。PL/SQL所有需要定义的内容,必须在该部分集中定义,而不能像某些高级语言那样可以在程序执行过程中定义。该部分是可选的。
②执行部分
执行部分以begin为标识。以end为结束标识。通过一系列语句和流程控制,实现数据查询、数据操纵、事务控制、游标处理等数据库操作的功能。执行部分是必须的。
③异常处理部分
异常处理部分以关键字exception为标识,以关键字end为结束标识。用于处理执行过程中产生的异常。该部分是可选的。
2.匿名块
匿名块是指动态生成,只能执行一次的块。它没有名字,不能由其他应用程序调用。
①
SQL> set serveroutput on
SQL> begin
2 dbms_output.put_line('This is the first anonymous block.');
3 end;
4 /
This is the first anonymous block.
PL/SQL 过程已成功完成。
②
SQL> declare
2 v_name varchar(20);
3 begin
4 select name into v_name from students where sid=10228;
5 dbms_output.put_line('学生姓名:'||v_name);
6 end;
7 /
学生姓名:林紫寒
PL/SQL 过程已成功完成。
③从控制台读入学生id,然后输入它的姓名
SQL> declare
2 v_name varchar(20);
3 begin
4 select name into v_name from students where sid=&stu_id;
5 dbms_output.put_line('学生姓名:'||v_name);
6 exception
7 when no_data_found then
8 dbms_output.put_line('No data found!');
9 end;
10 /
输入 stu_id 的值: 12343
原值 4: select name into v_name from students where sid=&stu_id;
新值 4: select name into v_name from students where sid=12343;
No data found!
PL/SQL 过程已成功完成。
————————————————————————————————————
SQL> /
输入 stu_id 的值: 10212
原值 4: select name into v_name from students where sid=&stu_id;
新值 4: select name into v_name from students where sid=10212;
学生姓名:欧阳春岚
PL/SQL 过程已成功完成。
3.命名块
PL/SQL命名块是指一次编译可以多次运行的PL/SQL程序,包括自定义函数、过程、包、触发器等。他们编译后放在服务器中,由应用程序或系统在特定的条件下进行调用。
具体实例见后文
4.PL/SQL基本语法
①.只有PL/SQL可以适用的一部分数字:20E3、2.232E-4、7*10**2(结果为700)。
②.如果文字中包含单引号,可以使用([]、()、<>)来分隔。但是这时需要使用q+单引号+[字符串]+单引号.
③
1.
SQL> declare
2 v_student students%rowtype;
3 begin
4 select * into v_student from students where sid=10212;
5 dbms_output.put_line('姓名 性别 出生日期 ');
6 dbms_output.put_line(v_student.name || v_student.sex || v_student.dob);
7 end;
8 /
姓名 性别 出生日期
欧阳春岚女12-3月 -89
PL/SQL 过程已成功完成。
2.
SQL> declare
2 v_id department.did%type;
3 v_name department.dname%type;
4 v_address department.address%type;
5 begin
6 select * into v_id,v_name,v_address from department where did=&id;
7 dbms_output.put_line('系部名称:'||v_name);
8 dbms_output.put_line('系部地址:'||v_address);
9 end;
10 /
输入 id 的值: 102
原值 6: select * into v_id,v_name,v_address from department where did=&id;
新值 6: select * into v_id,v_name,v_address from department where did=102;
系部名称:电气工程
系部地址:2号教学楼
3.
SQL> declare
2 v_id students.sid%type:=0199;
3 v_mid students.mid%type:=NULL;
4 v_name students.name%type:='张三';
5 v_sex students.sex%type:='女';
6 v_dob students.dob%type:='07-5月-2010';
7 v_specialty students.specialty%type:='计算机';
8 begin
9 insert into students values(v_id,v_mid,v_name,v_sex,v_dob,v_specialty);
10 end;
11 /
PL/SQL 过程已成功完成。
4.IF-THEN-ELSEIF-THEN-ELSE-ENDIF
SQL> DECLARE
2 v_id teachers.tid%TYPE;
3 v_title teachers.title%TYPE;
4 BEGIN
5 v_id := &teacher_id;
6 SELECT title INTO v_title
7 FROM Teachers WHERE tid = v_id;
8 IF v_title = '教授' THEN
9 UPDATE Teachers
10 SET wage = 1.1*wage WHERE tid=v_id;
11 ELSIF v_title = '高工' OR v_title= '副教授' THE
12 UPDATE Teachers
13 SET wage = 1.05*wage WHERE tid = v_id;
14 ELSE
15 UPDATE Teachers
16 SET wage = wage+100 WHERE tid = v_id;
17 END IF;
18 END;
19 /
输入 teacher_id 的值: 10103
原值 5: v_id := &teacher_id;
新值 5: v_id := 10103;
PL/SQL 过程已成功完成。
5.CASE-WHEN-THEN-END CASE
SQL> DECLARE
2 v_id Teachers.tid%TYPE;
3 v_title Teachers.title%TYPE;
4 BEGIN
5 v_id := &teacher_id;
6 SELECT title INTO v_title
7 FROM Teachers WHERE tid = v_id;
8 CASE
9 WHEN v_title = '教授' THEN
10 UPDATE Teachers
11 SET wage = 1.1*wage WHERE tid = v_id;
12 WHEN v_title = '高工' OR v_title= '副教授' THEN
13 UPDATE Teachers
14 SET wage = 1.05*wage WHERE tid = v_id;
15 ELSE
16 UPDATE Teachers
17 SET wage = wage+100 WHERE tid = v_id;
18 END CASE;
19 END;
20 /
输入 teacher_id 的值: 10103
原值 5: v_id := &teacher_id;
新值 5: v_id := 10103;
PL/SQL 过程已成功完成。
循环结构:
1.LOOP循环
SQL> declare
2 v_i int:=1;
3 v_sum int:=0;
4 begin
5 loop
6 v_sum:=v_sum+v_i;
7 exit when v_i=10;
8 v_i:=v_i+1;
9 dbms_output.put_line('The sum is:'||v_sum);
10 end loop;
11 end;
12 /
The sum is:1
The sum is:3
The sum is:6
The sum is:10
The sum is:15
The sum is:21
The sum is:28
The sum is:36
The sum is:45
PL/SQL 过程已成功完成。
2.WHILE循环
SQL> declare
2 v_i int:=1;
3 v_sum int:=0;
4 begin
5 while v_i<11 loop
6 v_sum:=v_sum+v_i;
7 v_i:=v_i+1;
8 end loop;
9 dbms_output.put_line('The result is:'||v_sum);
10 end;
11 /
The result is:55
PL/SQL 过程已成功完成。
3.FOR循环
SQL> declare
2 i int:=1;
3 v int:=0;
4 begin
5 for i in 1..10 loop
6 v:=i+v;
7 dbms_output.put_line('The result is:'||v);
8 end loop;
9 end;
10 /
The result is:1
The result is:3
The result is:6
The result is:10
The result is:15
The result is:21
The result is:28
The result is:36
The result is:45
The result is:55
PL/SQL 过程已成功完成。
5.GOTO和NULL语句。实现跳转
SQL> declare
2 i int:=1;
3 v int:=0;
4 begin
5 loop
6 v:=v+i;
7 if i=10 then
8 goto out;
9 end if;
10 i:=i+1;
11 end loop;
12 <<out>>
13 NULL;
14 dbms_output.put_line('The i is:'||i);
15 end ;
16 /
The i is:10
PL/SQL 过程已成功完成。