zoukankan      html  css  js  c++  java
  • 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 可以互相替代!
  • 相关阅读:
    WSS 3.0和MOSS 中的Web Parts
    WSS3.0 和 MOSS 的版本号小结
    设置firefox的默认google搜索.com而不是.hk
    wcf web service遇到"Could not load file or assembly App_Web..."问题
    ASP .NET readonly texbox 后台不能读取问题的解决办法
    2009年底泰国游总结
    把Silverlight的WCF service配置地址放到web.config中
    gvim编辑xml更新
    法意蜜月之旅总结
    法意蜜月之旅签证、交通、酒店篇
  • 原文地址:https://www.cnblogs.com/ZXF6/p/10836210.html
Copyright © 2011-2022 走看看