Oracle学习笔记(五)PL/SQL

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值