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 过程已成功完成。