pl/sql 编程!

一,pl/sql  是什么?

--一、pl/sql  是什么?

--1.sql是结构化查询语言。
--2.编程语言一般都能够声明变量,写条件判断,循环。sql不具备这些特征,所有sql不是一门编程语言。
--3.使用pl/sql有什么优点:
            --可以提高程序的运行效率,因为能够减少数据库的访问次数
            --可以对复杂的业务逻辑进行封装
            --pl/sql具有编程语言的特性,可以写if else 实现复杂的业务逻辑
 

二、pl/sql 块?

-- 二、pl/sql块?  分为 匿名块   和  命名块
--匿名块 没有名字块就是匿名块 匿名块不会保存到数据库中,执行完就没有了。类似于java的main方法
--命名块 有名字的块就是命名块。命名块 过程 函数 游标 触发器 都是命名块。

--问题?根据员工编号,打印员工的姓名
declare --变量声明部分
        v_ename varchar2(30);

begin   -- 业务逻辑处理部分
        select ename into v_ename from emp where empno=&输入员工编号;
        -- 把员工姓名打印到控制台
        dbms_output.put_line('员工姓名'||v_ename);
exception  -- 异常处理部分
         -- 异常处理部分
         when no_data_found then
         dbms_output.put_line('查无此人');
end;

--注意:
--1,pl/sql块 变量名,关键字不区分大小写。
--2,变量声明部分是可选的。业务逻辑处理部分是必须的。异常处理部分是可选的。
--3,end后面必须加; declare begin exception 后面都不要加;
--一般写匿名块都是先写结构,再往结构里面填代码。

三、变量和常量?

/*
  三、变量和常量
      声明变量 :
      变量名 变量类型;
      变量名一般建议以v_开头.
      声明常量要加上constant关键字常量名 constant 常量类型;
      
      需求:用户输入圆的半径,计算圆的面积。
*/
declare

      v_pi constant number(6,2):=3.14;-- 声明PI常量  number(m,n) 数字类型  pi 是小数,保留两位(6,2)
      
      v_area number(6,2); --声明圆的面积的变量  
   
      v_r number(6,2):=&输入圆的半径;--声明半径变量 
begin
      v_area:=v_pi*v_r*v_r;-- 计算圆的面积  注意  符号的问题    [:=]
      dbms_output.put_line('圆的面积是:'||v_area);-- 打印结果
exception
      when no_data_found then 
      dbms_output.put_line('输入正确的半径值');
end;

四、变量类型?

-- 四、变量类型?

/*1.基本类型

  类型名           说明
  varchar       定长字符串
  varchar2      变长字符串
  number(m,n) 数字类型
  date          日期类型
  timestamp     时间戳类型
*/

/*2.%type类型(列类型)? 

  %type类型指的是声明变量的时候,该变量参考某个表的某个列的类型。
  需求:根据员工的编号 查询员工的姓名和基本工资
*/
declare
-- 变量声明部分 ename sal     v_ename 类型参考emp表的ename的类型
  v_ename emp.ename%type;
  v_sal emp.sal%type;
  
begin
  select ename,sal into v_ename,v_sal from emp where empno=&输入员工编号;
  dbms_output.put_line('员工姓名:'||v_ename||' 基本工资:'||v_sal);
  
exception
  when no_data_found then
  dbms_output.put_line('查无此人');
  
end;

/*3.%rowtype(行类型)%rowtype参数某个表的类型。
  
    %rowtype中可以存储多个数据,具体可存多少个和表的字段数一样。
    需求?输入员工编号,打印员工的姓名,薪水,奖金,雇佣日期。
*/
declare
    v_emp emp%rowtype;-- 声明行类型变量
begin
    select* into v_emp from emp where empno=&输入员工编号;
    dbms_output.put_line(
       '员工姓名 '||v_emp.ename||'  基本工资'||v_emp.sal||'  奖金'||v_emp.comm||'  雇用日期'||v_emp.hiredate
    );
exception
    when no_data_found then
    dbms_output.put_line('查无此人');

end;

/*4.record类型(记录类型)
  
  
  record可以理解为可以自定义的行类型。
  record类型在使用之前必须声明该类型。
  
  需求:输入员工编号,打印员工的姓名,基本工资,总工资?
*/
declare
-- 声明record类型
    type emp_record_type is record(
         ename emp.ename%type,
         sal emp.sal%type,
         total emp.sal%type
    );
    v_emp emp_record_type;-- 声明record类型的变量
    
begin 
  select ename,sal,sal+nvl(comm,0)into v_emp from emp where empno=&no;-- 查询数据,给变量赋值
  dbms_output.put_line(
   '员工姓名'||v_emp.ename||'  基本工资'||v_emp.sal||'总工资'||v_emp.total
  );
exception 
  when no_data_found then
  dbms_output.put_line('查无此人');
  
end;

/*5.table(表类型)
  
  无论是行类型还是记录类型只能存储一行数据,如果要存储多行数据,需要用到table类型。
  table类型也需要先声明类型,再声明该类型的变量。
  
  需求?根据员工编号查询员工的信息,存储到table类型的变量中,再输出出来
*/
declare

-- 声明table类型 is table of 后可以跟行类型,也可以是记录类型
   type emp_table_type is table of emp%rowtype 
   index by binary_integer;-- 指定下标的增长方式为整数,每次增长
   v_emp emp_table_type;   -- 声明table类型的变量
begin
  -- 把编号为7369的员工的信息存储到table类型变量中
  select * into v_emp(1)from emp where empno=7369;
  select * into v_emp(2)from emp where empno=7499;
  --数据table类型变量中的数据
  dbms_output.put_line('员工姓名'||v_emp(1).ename||'  奖金'||v_emp(1).comm);
  dbms_output.put_line('员工姓名'||v_emp(2).ename||'  奖金'||v_emp(2).comm);
exception
  when no_data_found then
  dbms_output.put_line('查无此人');

end;

五。条件判断?

-- 五 、条件判断?

/*1.if /else

语法:
   if 条件表达式 then
语句块;
   if 条件表达式 then
语句块
   end if;
   elsif 条件表达式 then
语句块;
   ...
else
   语句块;
end if;

需求:输入一个员工编号,给该员工涨奖金。策略是这样的:
      如果原来员工没有奖金,则把基本工资的百分之10作为奖金,如果原来员工的奖金低于1000,把奖金提升到
      1000,其他情况奖金提升百分之10.
*/

declare
-- 声明奖金的变量
      v_comm emp.comm%type;
begin
-- 查询出员工的奖金
      select comm into v_comm from emp where empno=&no; 
-- 判断如果员工没有奖金,把基本工资的百分之10作为奖金
      if v_comm is null then
       update emp set comm=sal*0.1 where empno=&no; 
--如果原先奖金低于1000,提升到1000
      elsif v_comm<1000 then
      update emp set comm=1000 where  empno=&no;
-- 其他情况把奖金提升百分之10
      else
        update emp set comm=comm*1.1 where empno=&no;
      end if;
end ;

/*2.case when      case when 和java中switch:

case when 语法:
     case 变量名
     when 变量值1 then
语句块;
     when 变量值2 then
语句块;
     ........
     else:
语句块;
     end case;
     
   需求?:根据用户输入的部门编号,输出不同的部门名称,要求使用case when实现,不查询dept表
*/

declare
-- 声明部门编号的变量
   v_deptno emp.deptno%type:=&no;
begin
   case v_deptno
     when 10 then
       dbms_output.put_line('技术部');
     when 20 then 
       dbms_output.put_line('销售部');
     when 30 then 
       dbms_output.put_line('公关部');
     when 40 then 
       dbms_output.put_line('开发部');
     else
       dbms_output.put_line('查无此部');
     end case;
end;

--注意  if else 和 case when 可以互相替代!

猜你喜欢

转载自www.cnblogs.com/ZXF6/p/10836210.html