Oracle PLSQL编程

PLSQL编程介绍:

将一些数据的处理过程放在数据库上面,可以避免因为网络瓶颈造成的一些时间上的消耗。

可有利于系统的移植,大部分的数据处理和分析可以共享。

过程化编程语言,用来编写包含SQL语句的程序。可以向数据库应用程序中加入业务逻辑处理功能。


pl/sql结构

在PL/SQL中只能用 SQL语句中的DML部分,不能使用DDL部分,如果要在PL/SQL中使用DDL(如CREATE TABLE等)的话,只能以动态的方式使用。

PL/SQL程序由块结构组成,每一个块都包含有PL/SQL和SQL语句

语法结构:
[DECLARE 
--  程序的声明部分,例如,定义变量 
]
BEGIN 
--  程序的执行体,具体的操作代码 
[EXCEPTION 
  --  异常的处理 
]

END ;


常量的赋值语法:
varName constant varType := varValue;  

变量的几种赋值方式:
1: varName varType :=  varValue;
2:  select into 
3:  varName user.table.column%type;
4:  varCollecton user.table%type;


--1.使用select into 为变量赋值

declare
       v_empno number;   --员工编号。
begin
       --将emp表中SMITH员工的编号赋值给v_empno并输出编号的值
       select empno into v_empno from scott.emp where ename='SMITH';
       dbms_output.put_line('v_empno 等于' || v_empno);  --输出v_empno的值
end;

--2.求圆的面积(常量的使用)

declare
       pi constant number :=3.14;   --圆周率长值(注:pi的值为常量)  
       r number default 3;   --圆的半径默认值3  
       area number;   --面积。
begin
       area:=pi*r*r;   --计算面积
       dbms_output.put_line(area);  --输出圆的面积

end;
--3.求圆的面积(变量的使用)当PI等于另外一个值的时候,使用变量求出圆的面积(使用:= 方式给变量赋值)
declare
       pi  number :=3.14;   --圆周率长值  
       r number default 3;   --圆的半径默认值3  
       area number;   --面积。
begin
        pi :=45; -- 值可以改变
       area:=pi*r*r;   --计算面积
       dbms_output.put_line(area);  --输出圆的面积
end;
复合数据类型的使用:
%TYPE: 用于取得表、视图、或游标中的字段类型
%ROWTYPE: 用于取得表、视图或游标的行类型
  
--4.声明一个变量,变量的类型为scott.emp表的empno字段类型,然后在控制台输出
--声明一个变量,变量的类型为scott.emp表的整行的复合类型,然后在控制台输出 
 
-- 声明一个变量,变量的类型为scott.emp表的empno字段类型
declare
      id_num  scott.emp.empno%type;
begin
      select empno into id_num from scott.emp where ename='SMITH'; -- 为id_num赋值
      dbms_output.put_line(id_num); -- 输出id_num中的值
end;
-- 声明一个变量,变量的类型为scott.emp表的整行的复合类型,然后在控制台输出 
declare
        emp_info  scott.emp%rowtype;
begin
      select * into emp_info from scott.emp where empno=7369;
      -- 输出emp_info中的值
      dbms_output.put_line(emp_info.empno ||',' || emp_info.ename); 
end;
    %type,%rowtype总结:
不需要知道被引用的表列或行的具体类型
如果被引用对象的数据类型发生改变,PL/SQL 变量的数据类型也随之改变


语法:

一、
IF <条件1> THEN
语句
[ELSIF <条件2> THEN
语句
ELSIF <条件n> THEN
语句]
[ELSE 
语句]
END IF;
二、
CASE <变量>
  WHEN <表达式1> THEN 语句1;
  WHEN <表达式2> THEN 语句2;
  ...
  WHEN <表达式n> THEN 语句n;
  ELSE 语句;

END CASE;

1. 如果某个学生的Java成绩大于等于90分则打印奖励IPone6一个,否则打印继续努力

declare
   java_score int;
begin
   java_score:= '&请输入学生的Java成绩'; 
   if java_score > 90 then
     dbms_output.put_line('奖励IPone6一个');
   else 
     dbms_output.put_line('继续努力');
   end if;  
end;
2. 如果某个学生的Java成绩大于等于90分,并且C语言成绩大于等于80分则奖励苹果电脑一台,
否则打印继续努力
declare
   java_score int; -- Java成绩
   c_score int; -- c语言成绩
begin
   java_score:= '&请输入学生的Java成绩';
   c_score:= '&请输入学生的C语言成绩';  
   if java_score >= 90 and c_score >= 80 then
     dbms_output.put_line('奖励苹果电脑一台');
   else 
     dbms_output.put_line('继续努力');
   end if;  
end;
3.某学生的分数>=90,则该学生成绩为“A”;如果该学生的分数在90-80之间,则该学生成绩为“B”;

如果该学生的分数在80-70之间,则该学生成绩为“C”;如果该学生的分数在70-60之间,则该学生成绩的分数在60以下,则该学生成绩为“不及格”。

declare

  score integer;

  grade char;
begin
  score:='&请输入学生成绩';  --使用&符号可以接收用户的输入数据    
  if score >=90 then
     grade:='A';
  elsif  score >=80 then
     grade:='B';
  elsif  score >=70 then
     grade:='C';
  elsif  score >=60 then
     grade:='D';
  else
     grade:='F';
  end if;
  dbms_output.put_line('Your grade is '||grade);
end;

4.根据月份的值判断该月份所属季节
/*
    冬季: 12,1,2
    春季: 3,4,5
    夏季: 6,7,8
    秋季: 9,10,11
*/

declare
  v_month number;
  v_season varchar2(30);
begin
  v_month:='&请输入月份';  --使用&符号可以接收用户的输入数据    
  if v_month = 12 or v_month=1 or v_month = 2 then
     v_season:= '冬季';
  elsif v_month = 3 or v_month=4 or v_month = 5 then
     v_season:= '春季';
  elsif v_month = 6 or v_month=7 or v_month = 8 then
    v_season:= '夏季';
  elsif  v_month = 9 or v_month=10 or v_month = 11 then
     v_season:= '秋季';
  else
     v_season:='月份错误';
  end if;
  dbms_output.put_line(v_month || '月份是'||v_season);
end;
5.某学生的分数>=90,则该学生成绩为“A”;如果该学生的分数在90-80之间,则该学生成绩为“B”;
如果该学生的分数在80-70之间,则该学生成绩为“C”;如果该学生的分数在70-60之间,则该学生成绩
为“D”;如果该学生的分数在60以下,则该学生成绩为“不及格”。(使用case 的方式来实现)
declare
  score int;
  v_level varchar(2); --成绩等级
begin
   score:='&请输入成绩'; 
     case
       when score >= 90 then v_level:='A';
       when score >= 80 then v_level:='B';
       when score >= 60 then v_level:='C';
       else v_level:= 'D';
     end case; 
   dbms_output.put_line(v_level);       
end;

LOOP
    要执行的语句;
    IF <条件语句>  THEN
      要执行的语句;
      EXIT ;       --条件满足,退出循环语句
    END IF;  
END LOOP;

6.case 高级用法,实现查询的行转列
-- 考试信息表

create table t_exam_info(
    f_id int primary key,
    f_name varchar2(30),
    f_subject varchar(30),
    f_score number(3,1)   
);


insert into t_exam_info values(1, '德玛', '语文', 89);
insert into t_exam_info values(2, '德玛', '数学', 90);
insert into t_exam_info values(3, '德玛', '英语', 80);
insert into t_exam_info values(4, '亚希', '语文', 81);
insert into t_exam_info values(5, '亚希', '数学', 82);
insert into t_exam_info values(6, '亚希', '英语', 83);
insert into t_exam_info values(7, '卡特', '数学', 84);
insert into t_exam_info values(8, '卡特', '英语', 85);


select * from t_exam_info;


select f_name,  
       sum( case when f_subject = '语文' then f_score ELSE 0 END ) 语文,  
       sum( case when f_subject = '数学' then f_score ELSE 0 END ) 数学,  
       sum( case when f_subject = '英语' then f_score ELSE 0 END ) 英语  
  from t_exam_info  
 group by f_name  


--1.要求声明变量,每次循环都需要为变量减少数字1,并输出结果。当变量值小于3时,退出循环操作。

declare
  v1 integer:=10;
begin
loop
  v1:=v1 - 1;
  dbms_output.put_line('v1:' || v1);
  if v1 < 3 then
    dbms_output.put_line('The variable v1 is less than 3');
    exit;            --使用exit语句退出loop循环
  end if;
end loop;
end;

LOOP
    要执行的语句;
    EXIT WHEN <条件语句>; --条件满足,退出循环语句
END LOOP;
declare
  v1 integer:=10;
begin
loop
    v1:=v1 - 1;
    dbms_output.put_line('v1:' || v1);      
    exit when v1 < 3;            --使用exit when(后面使用boolean表达式,如果该表达式返回true则退出当前循环)语句退出loop循环
end loop;
end;

WHILE <布尔表达式> LOOP
    要执行的语句;
END LOOP;

--2.要求声明变量,每次循环都需要为变量增加数字1,并输出结果。当变量值小于20时,退出循环操作(while循环实现)。

declare
  total integer:=0;
begin
  while total < 20 loop
    dbms_output.put_line('The valus of total is ' || total);
    total:=total + 1;
end loop;
end;

FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP
  要执行的语句;
END LOOP [循环标签];

--3.要求声明变量,然后再确定循环值的范围,每次循环都需要为变量增加数字1,并在最后输出循环次数


declare
  total integer:=0;
begin
  for i in 2..4 loop --使用for确定循环的值的范围
      total:=total + 1;
    end loop;
    dbms_output.put_line('The total is ' || total);
end;

--4.使用循环打印以下图形

    *
    **
    ***
    ****
    *****
    练习嵌套循环
    外层循环控制行
    内层循环控制每一行打印的星星的个数

declare
begin
  for i in  1..5 loop
     for j in 1..i loop 
         dbms_output.put('*'); -- 不换行输出
     end loop;
     -- 打印完一行之后换行
     dbms_output.put_line('');
  end loop;
end;
-- 5.使用for循环打印九九乘法表

declare
begin
       for i in  1..9 loop
         for j in 1..i loop
             dbms_output.put(j || '*' || i || '=' || (i * j) || '  ');
         end loop;
             dbms_output.put_line('');  
       end loop;   
 end;

猜你喜欢

转载自blog.csdn.net/mao502010435/article/details/80772769