• Oracle PL/SQL编程基础


    1, PL/SQL简介: PL/SQL是ORACLE的过程化语言,包括一整套的数据类型、条件结构、循环结构和异常处理结构,PL/SQL可以执行SQL语句,SQL语句中也可以使用PL/SQL函数。

    2,PL/SQL优点和特性:

            a,提高运用程序的运行性能

            b,提供模块化的程序设计功能

            c,允许定义标示符

            d,具有过程语言控制结构

            e,具备良好的兼容性

            f,处理运行错误

    3,PL/SQL块:

    DECLARE
    …定义部分-变量,常量,游标,例解
    BEGIN
    …执行部分-PL/SQL,SQL语句
    EXCEPTION
    --异常处理部分-处理运行错误
    END;--块结束标志

    注意:declare,begin,exception后面没有分号,而end后则必须要有分号
    declare
        v_name varchar2(20);
    begin
    select ename into v_name from scott.emp where empno=&empno;
    dbms_output.put_line('员工姓名:'||v_name);
    exception
    when no_data_found then
        dbms_output.put_line('请输入正确的员工工号!');
    end

    4,PL/SQL数据类型:

    名称

    类型

    说明

    NUMBER

    数字型

    能存放整数值和实数值,并且可以定义精度和取值范围

    BINARY_INTEGER

    数字型

    可存储带符号整数,为整数计算优化性能

    DEC

    数字型

    NUMBER的子类型,小数

    DOUBLE PRECISION

    数字型

    NUMBER的子类型,高精度实数

    INTEGER

    数字型

    NUMBER的子类型,整数

    INT

    数字型

    NUMBER的子类型,整数

    NUMERIC

    数字型

    NUMBER的子类型,与NUMBER等价

    REAL

    数字型

    NUMBER的子类型,与NUMBER等价

    SMALLINT

    数字型

    NUMBER的子类型,取值范围比INTEGER小

    VARCHAR2

    字符型

    存放可变长字符串,有最大长度

    CHAR

    字符型

    定长字符串

    LONG

    字符型

    变长字符串,最大长度可达32,767

    DATE

    日期型

    以数据库相同的格式存放日期值

    BOOLEAN

    布尔型

    TRUE OR FALSE

    ROWID

    ROWID

    存放数据库的行号

    5,标量类型:a,varchar2(20):用于可定长度的字符串,最大长度32767,其值的长度不超过2000字节

          b,char(n):定义固定长度的字符串,如果不指定n的值,n默认为1

          c,number(p,s):定义固定长度的整数和浮点数,其中p用于指定数字的总位数,s用于指定小数点后的数字位数

          d,date:定义日期和时间类型,其数据长度定为7个字节长度

          e,timestamp:定义日期和时间数据,赋值方法和date类型的赋值方法一致,而且还会显示时间,上下午标志和时区

          f,boolean:定义布尔变量,其变量的值为true,false或null

    6,PL/SQL控制结构:

          IF语句

    1 BEGIN
    2   IF 1 = 2 THEN
    3     DBMS_OUTPUT.PUT_LINE('1=2');
    4   END IF;
    5 END;

          IF/ELSE语句

    1 BEGIN
    2   IF 1 = 2 THEN
    3     DBMS_OUTPUT.PUT_LINE('1=2');
    4   ELSE
    5     DBMS_OUTPUT.PUT_LINE('1<>2');
    6   END IF;
    7 END;

          IF/ELSEIF/ELSE语句

    1 BEGIN
    2   IF 1 > 2 THEN
    3     DBMS_OUTPUT.PUT_LINE('1 > 2');
    4   ELSIF 1 < 2 THEN
    5     DBMS_OUTPUT.PUT_LINE('1 < 2');
    6   ELSE 
    7     DBMS_OUTPUT.PUT_LINE('1 = 2');
    8   END IF;
    9 END;

          LOOP循环,基础LOOP循环

    1 DECLARE
    2   V_COUNT NUMBER := 0;
    3 BEGIN
    4   LOOP
    5     V_COUNT := V_COUNT + 1;
    6     DBMS_OUTPUT.PUT_LINE('循环到:' || V_COUNT);
    7     EXIT WHEN V_COUNT = 10;
    8   END LOOP;
    9 END;

          LOOP循环,while__LOOP循环

    1 DECLARE
    2   V_COUNT NUMBER := 0;
    3 BEGIN
    4   WHILE V_COUNT < 10 LOOP
    5     V_COUNT := V_COUNT + 1;
    6     DBMS_OUTPUT.PUT_LINE('循环到:' || V_COUNT);
    7   END LOOP;
    8 END;

          LOOP循环,FOR----LOOP循环

    1 BEGIN
    2   FOR IDX IN 1 .. 10 LOOP
    3     DBMS_OUTPUT.PUT_LINE('循环到:' || IDX);
    4   END LOOP;
    5 END;

    7,异常处理:Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理。为了提高程序的健壮性,可以在PL/SQL块中引入异常处理部分,进行捕捉异常,并根据异常出现的情况进行相应的处理。

    一、异常的类型 

        ORACLE异常分为两种类型:系统异常、自定义异常。

        其中系统异常又分为:预定义异常和非预定义异常。

     

        1.预定义异常

            ORACLE定义了他们的错误编号和异常名字,常见的预定义异常处理Oracle常见的错误

       

            NO_DATA_FOUND          SELECT ... INTO ... 时,没有找到数据

            DUL_VAL_ON_INDEX       试图在一个有惟一性约束的列上存储重复值

            CURSOR_ALREADY_OPEN    试图打开一个已经打开的游标

            TOO_MANY_ROWS          SELECT ... INTO ... 时,查询的结果是多值

            ZERO_DIVIDE            零被整除

     

        2.非预定义异常

            ORACLE为它定义了错误编号,但没有定义异常名字。我们使用的时候,先声名一个异常名,

            通过伪过程PRAGMA EXCEPTION_INIT,将异常名与错误号关联起来。

     

        3.自定义异常

            程序员从我们业务角度出发,制定的一些规则和限制。

    二、异常处理

        PL/SQL中,异常处理按个步骤进行:

            定义异常

            抛出异常

            捕获及处理异常

     

        a.定义异常

            exception_name EXCEPTION;

     

        b.抛出异常

            RAISE exception_name

     

        c.捕获及处理异常

            EXCEPTION

                WHEN e_name1 [OR e_name2 ... ] THEN

                    statements;

                WHEN e_name3 [OR e_name4 ... ] THEN

                    statements;

                    ......

                WHEN OTHERS THEN

                    statements;

            END;

    8,游标:

    (1).定义

            映射在结果集中某一行数据的具体位置,类似于C语言中的指针。即通过游标方式定位到结果集中某个特定的行,然后根据业务需求

            对该行进行相应特定的操作。

           

       (2).游标的分类

            显示游标:即用户自定义游标,专门用于处理select语句返回的多行数据

            隐式游标:系统自动定义的游标,记录集只有单行数据,用于处理select into 和DML语句

     

        (3).游标使用的一般过程:

            显示游标:声明, 打开, 读取, 关闭

            隐式游标:直接使用读取,声明、打开、关闭都是系统自动进行的

     

        (4).显示游标的过程描述

            a.声明游标

                CURSOR cursor_name IS select_statement

                如:CURSOR emp_cur IS SELECT empno,ename,job,sal FROM scott.emp;

     

            b.打开游标

                OPEN cursor_name     --打开游标则执行对应的select语句,将对应的结果集存放到游标当中

                如:OPEN emp_cur

     

            c.读取数据

                FETCH cursor_name INTO var_name1,...var_name2 ;   --提取单行数据,需要配合循环语句来使用

                FETCH cursor_name BULK COLLECT INTO collect1,collect2,...[LIMIT rows];    --提取多行数据,collect为集合变量

               

            d.关闭游标

                CLOSE cursor_name

     

        (5).显示游标的个属性

            cursor_name%ISOPEN      游标是否打开   

            cursor_name%FOUND       最近的FETCH是否提取到数据

            cursor_name%NOTFOUND       最近的FETCH是否没有提取到数据

            cursor_name%ROWCOUNT       返回到目前为止,已经从游标缓冲区中提取到数据的行数

          (6).游标FOR循环:

        游标FOR循环是为了简化游标使用过程而设计的。使用游标FOR循环检索游标时,游标的打开、数据提取、数据是否检索到的判断与游标

        的关闭都是ORACLE系统自动进行的。

    格式一:
                先在定义部分定义游标,然后在游标FOR循环中引用该游标
               
                FOR record_name IN cursor_name LOOP
                    statement1;
                    statement2;
                END LOOP;
     
            格式二:
                在FOR循环中直接引用子查询,隐式定义游标
     
                FOR record_name IN subquery LOOP
                    statement;
                END LOOP;

       (7).参数游标

        参数游标是指带有参数的游标。当定义了参数游标后,使用不同的参数值多次打开游标则会生成不同的结果集。

     定义参数游标:
       
            CURSOR cursor_name (para_name1 datatype [,para_name2 datatype ...])
            IS select_statement;

    心得:游标太难懂了

  • 相关阅读:
    阅读随笔
    四则运算生成器基础版
    《梦断代码》阅读计划
    JavaScript值传递和引用传递
    nodejs包高效升级插件npm-check-updates
    JavaScript常用技巧之进制转换
    js 数组、字符串、Json互相转换
    利用Stream模式进行文件拷贝
    ACM-ICPC 2018 焦作赛区网络预赛 H、L
    ACM-ICPC 2018 沈阳赛区网络预赛 G 容斥原理
  • 原文地址:https://www.cnblogs.com/dclcc/p/3490851.html
Copyright © 2020-2023  润新知