zoukankan      html  css  js  c++  java
  • 浅谈PL/SQL语言基础

      在前面的学习中,我们大部分接触的都是SQL语言,但是,在实现复杂操作的时候,SQL语言就无能为力了,这时候就需要引入新的语言,PL/SQL语言就是对SQL语言的扩展,可以实现存储过程,函数等的创建。下面是我对PL/SQL语言的总结,和大家分享一下。

    一.基本结构

    1.PL/SQL是一种块结构的语言,它将一组语句放在一个块中,一次性发送给服务器,当PL/SQL引擎分析收到PL/SQL语句块中的内容,把其中的过程语句由PL/SQL引擎自身去执行,把PL/SQL语句块中的SQL语句交给服务器的SQL语句去执行。

    2.PL/SQL的块都是由声明变量(可省略),程序代码(必填)和异常处理(可省略)组成。    

      代码结构:declare

             变量声明

           begin

             程序体

           exception

             异常处理

           end;

      示例一

    set serveroutput on;
    --打开控制台输出,切记,不能在该语句后面写注释,否则报错。
    declare 
      str varchar(20):='Hello World!';
    begin
      dbms_output.put_line(str);
    end;

    3.PL/SQL中常量和变量的声明

      1>常量(使用constant关键字)

        示例:declare num constant int:=1;

      2>变量(参照(2)中的declare介绍)

    4.特殊的变量类型

      1>%type

    set serveroutput on;
    declare
      cname bank.customername%type; --cname类型和bank表中的customername的类型一样
    begin
      select customername into cname from bank where customername='李四';
      dbms_output.put_line(cname);
    end;

      2>%rowtype

    set serveroutput on;
    declare
      recordbank bank%rowtype; --引用bank表中一行数据类型,即recordbank可以存放bank表中的一条数据
    begin
      select * into recordbank from bank where customername='李四';
      dbms_output.put_line(recordbank.customername||'存款为'||recordbank.currentmoney);
    end;

    5.接收用户的输入

    set serveroutput on;
    declare 
      str varchar(20);
    begin
      str:=&age;
      dbms_output.put_line(str);
    end;

    6.从查询结果中赋值(使用into关键字)

    set serveroutput on;
    declare
      cname bank.customername%type; --cname类型和bank表中的customername的类型一样
    begin
      select customername into cname from bank where customername='李四';
      dbms_output.put_line(cname);
    end;

    二.流程控制语句

      PL/SQL的流程控制语句和我们常用的java等语言原理相同,除了使用时的方法略有不同,下面仅列出PL/SQL中使用方法和其他语言不同的流程控制语句。

    1.条件控制语句
      (1)使用if
    set serveroutput on;
    declare 
      num int :=#
    begin
      --判断if正确则执行then,否则执行else(elsif为嵌套判断)
      if num>0 then
        dbms_output.put_line('输入数字大于零');
      elsif num=0 then 
      --注意elsif,里面少一个e
        dbms_output.put_line('输入数字等于零');
      else
        dbms_output.put_line('输入数字小于零');
      end if;
    end;
      (2)使用case
    set serveroutput on;
    declare 
      num int ;
      i int;
    begin
      --有逻辑的从数值中做出选择
      num:=(case when 1=2 then 11 else 22 end);
      i:=(case num when 11 then 111 when 22 then 222 else 0 end);
      dbms_output.put_line('num'||num||',i为'||i);
    end;
    2.循环控制语句
      (1)循环控制,用判断语句执行exit
    set serveroutput on;
    declare 
      ssum int :=0;
      i int :=1;
    begin
      loop 
        ssum := ssum+i;
        i:=i+1;
        if i>5 then
          exit;
        end if;
      end loop;
      dbms_output.put_line('1+2+3+4+5='||ssum);
    end;
      (2)循环控制,当when为真时执行exit
    set serveroutput on;
    declare 
      ssum int :=0;
      i int :=1;
    begin
      loop 
        ssum := ssum+i;
        i:=i+1;
        exit when i>5;
      end loop;
      dbms_output.put_line('1+2+3+4+5='||ssum);
    end;
      (3)循环控制,当while为真时循环
    set serveroutput on;
    declare 
      ssum int :=0;
      i int :=1;
    begin
      while i<=5 loop 
        ssum := ssum+i;
        i:=i+1;
      end loop;
      dbms_output.put_line('1+2+3+4+5='||ssum);
    end;
      (4)已知循环次数的循环
    set serveroutput on;
    declare 
      ssum int :=0;
    begin
      for i in 1..5 loop 
      --i不用声明定义,并且不用i:=i++;
        ssum := ssum+i;
      end loop;
      dbms_output.put_line('1+2+3+4+5='||ssum);
    end;

    三.异常处理

    1.格式

      EXCEPTION
        WHEN <异常情况名> THEN
          <异常处理代码>
        WHEN <异常情况名> THEN
          <异常处理代码>
        WHEN OTHERS THEN
          <异常处理代码>

      示例

    set serveroutput on;
    declare 
      recordbank bank%rowtype;
    begin
      select * into recordbank from bank where customername='王柳';
    exception
      when no_data_found then
        dbms_output.put_line('没有找到该客户');
      when others then
        dbms_output.put_line('其他错误');
    end;

    2.常见异常

    异常 说明
    CURSOR_ALREADY_OPEN 用户试图重新打开已经打开的游标时出现
    INVALID_CURSOR 在执行非法游标运算(如fetch一个尚未打开的游标)时出现
    NO_DATA_FOUND 没有找到数据
    TOO_MANY_ROWS 执行select语句时返回多行
    VALUE_ERROR 在产生大小限制时出现,如变量中的列值超出变量的大小
    ZERO_DIVIDE 以零做除数时出现

    3.自定义异常

    set serveroutput on;
    declare
      myException exception;
    begin
      update bank set customername = '王柳' where customername='李亮';
      if SQL%NOTFOUND then
        raise myException;
      end if;
    exception
      when myException then
        dbms_output.put_line(SQLCODE||' errer '||SQLERRM);
    end;

    4.重新定义系统异常

    set serveroutput on;
    declare
      myException EXCEPTION;
    begin
        update bank set customername = '王柳' where customername='李亮';
        if SQL%NOTFOUND then
            --调用系统的异常处理,抛出异常
            RAISE_APPLICATION_ERROR(-20001,'can not found any row!');
        end if;
        EXCEPTION
            when myException then dbms_output.put_line('user errors');
            when others then
              dbms_output.put_line('Others   '||SQLCODE||'   '||SQLERRM);
    end;
  • 相关阅读:
    根据时间戳获取年月日时分秒
    除法函数,乘法函数,加法函数,减法函数
    禁止鼠标点右键
    获取cookie,设置cookie,删除cookie
    解决 堆栈 出现的父对象和子对象相关联的问题 (深拷贝)
    团队展示
    用户规格说明书——结对编程
    测试与优化——结对编程
    程序开发——结对编程
    程序开发初体验
  • 原文地址:https://www.cnblogs.com/zlbx/p/4808861.html
Copyright © 2011-2022 走看看