zoukankan      html  css  js  c++  java
  • Oracle | PL/SQL编程

    PL/SQL(Procedural Language/SQL,过程化SQL语言),是一种高级数据库程序设计语言,专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。

    PL/SQL 中可引用的SQL语句

    • 可用DML语句:SELECT INTO,INSERT,UPDATE,DELETE。
    • 可用TCL语句:COMMIT,ROLLBACK,SAVEPOINT。
    • 不能使用DDL语句。

    PL/SQL 块

    PL/SQL块:声明部分+执行部分+异常处理部分

    -- 单行注释
    DECLARE
    	/* 声明部分:声明变量,类型、游标、局部存储过程和函数 */
    BEGIN
    	/* 执行部分:执行过程和SQL语句 */
    [EXCEPTION]
    	/* 异常处理部分 */
    END;
    

    PL/SQL 变量

    PL/SQL 变量命名

    标识符 命名规则
    程序变量 V_name
    程序常量 C_Name
    游标变量 Name_cursor
    异常标识 E_name
    表类型 Name_table_type
    Name_table
    记录类型 Name_record

    PL/SQL 变量类型

    基本数据类型

    number,char,varchar2,long,date

    记录类型

    记录类型:把逻辑相关的数据作为一个单元存储起来,用于存放互不相同但逻辑相关的信息。

    TYPE record_type IS RECORD(
       Field1 type1  [NOT NULL]  [:= exp1 ],
       Field2 type2  [NOT NULL]  [:= exp2 ],
       . . .   . . .
       Fieldn typen  [NOT NULL]  [:= expn ] ) ;
    

    %TYPE 类型

    %TYPE类型:指某个已定义变量的数据类型类型,或数据表中某列的数据类型。

    使用%TYPE特性的优点:

    • 所引用的数据库列的数据类型可以不必知道;
    • 所引用的数据库列的数据类型可以实时改变。

    %RowType 类型

    %RowType类型:返回一个与数据库表的数据结构一致的记录类型。

    使用%ROWTYPE特性的优点:

    • 所引用的数据库中列的个数和数据类型可以不必知道;
    • 所引用的数据库中列的个数和数据类型可以实时改变。

    PL/SQL 特殊运算符

    赋值运算符::=
    关系运算符:=>
    上下限运算符:..

    PL/SQL 流程控制

    条件语句

    IF 语句

    IF <条件语句1> THEN
    	语句1;
    ELSIF <条件语句2> THEN
    	语句2;
    ELSE
    	语句3;
    END IF;
    

    注意是ELSIF不是ELSEIF

    CASE 语句

    CASE <变量>
    	WHEN <值1> THEN <结果1>
    	WHEN <值2> THEN <结果1>
    	...
    	WHEN <值N> THEN <结果N>
    	[ELSE <结果N+1>]
    END;
    

    循环语句

    do...while 循环

    LOOP
    	循环语句;
    	EXIT WHEN <条件语句>
    END LOOP;
    

    while 循环

    WHILE <条件语句> LOOP
    	循环语句;
    END LOOP;
    

    for 循环

    FOR <循环计数器> IN [REVERSE] <下限> .. <上限> LOOP
      循环语句;
    END LOOP;
    

    GOTO 语句

    定义标号:<<标号名>>

    GOTO语句:GOTO 标号名

    NULL 语句

    NULL语句:不做任何事,增强代码可读性。

    PL/SQL 异常处理

    异常错误类型

    • 预定义错误:无需在程序中定义,由Oracle自动将其引发。
    • 非预定义错误:用户需在程序中定义,然后由Oracle自动将其引发。
    • 用户定义错误:用户在程序中定义,然后显式地在程序中将其引发。

    异常处理

    EXCEPTION
       WHEN <异常1> THEN  <异常处理代码>
       WHEN <异常2> THEN  <异常处理代码>
       WHEN OTHERS THEN  <异常处理代码>
    

    游标-CURSOR

    为了处理 SQL 语句,Oracle 会分配一片叫上下文 (context area) 的区域来处理所必需的信息,即系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。游标就是一个指向上下文的句柄或指针。

    显式游标

    显式游标主要是用于对查询语句的处理,尤其是查询结果为多条记录的情况。

    显式游标处理

    ①定义游标:定义游标名及对应的 SELECT 查询

    CURSOR cursor_name (参数1 参数类型,参数2 参数类型...) IS 
    SELECT查询块;
    

    数据类型不能使用长度约束。

    ②打开游标:执行游标的 SELECT 查询,将查询结果放入缓冲区,并指向缓冲区首部。

    OPEN cursor_name (参数1 => 值,参数2 => 值...);
    

    ③提取游标数据:检索结果集中的数据行,放入指定输出变量中。

    FETCH cursor_name INTO {variable_list | record_variable };
    

    ④关闭游标:释放游标占用的系统资源。

    CLOSE cursor_name;
    

    显式游标属性

    游标属性 描述
    %FOUND 布尔型,当最近一次读记录时成功返回,则值为TRUE
    %NOTFOUND 布尔型,当最近一次读记录时返回失败,则值为TRUE
    %ISOPEN 布尔型,当游标已打开时返回 TRUE
    %ROWCOUNT 数值型,返回已从游标中读取的记录数

    游标的FOR循环:

    FOR 索引 IN 游标[值1,值2...] LOOP
        循环语句;
    END LOOP;
    

    隐式游标

    隐式游标主要用于数据更新操作。隐式游标的名字为SQL,由Oracle系统提供,无需用户处理。

    隐式游标属性

    游标属性 描述
    SQL%FOUND 布尔型,当最近一次读记录时成功返回,则值为TRUE
    SQL%NOTFOUND 布尔型,当最近一次读记录时返回失败,则值为TRUE
    SQL%ISOPEN 布尔型,当游标已打开时返回 TRUE
    SQL%ROWCOUNT 数值型,返回已从游标中读取的记录数

    存储过程与函数

    存储过程用于执行特定操作,无返回值;函数用于执行复杂操作,有返回值;存储函数与函数统称为PL/SQL子程序。

    存储过程-PROCEDURE

    存储过程:执行特定操作,无返回值,多用于更新操作。

    定义存储过程

    CREATE [OR REPLACE] PROCEDURE Procedure_name
    [ (argment [ { IN | IN OUT }] Type,
          argment [ { IN | OUT | IN OUT } ] Type ]
    { IS | AS }
    <类型.变量的说明> 
    BEGIN
    	<执行部分>
    EXCEPTION
    	<异常处理>
    END;
    

    函数-FUNCTION

    函数:执行复杂操作,有返回值。

    定义函数

    CREATE [OR REPLACE] FUNCTION <函数名>[(argument [ { IN | IN OUT }] type,argument [ { IN | OUT | IN OUT } ] type]RETURN <返回值类型>
    { IS | AS }
    	<类型.变量的说明> 
    BEGIN
    	<执行部分>
    EXCEPTION
    	<异常处理>
    END;
    

    函数执行方式

    dbms_output.put_line(fun());
    
    select fun() from dual;
    

    函数参数类型

    • 输入参数 IN
    • 输出参数 OUT
    • 输入输出参数 IN OUT

    参数传递类型

    位置表示法:根据参数位置依此传值

    argument_value1[,argument_value2 …]
    

    名称表示法:使用关系运算符=>为参数传值

    argument => parameter [,…]
    

    触发器-TRIGGER

    触发器:用户定义的一类由事件触发而执行的特殊过程。

    定义触发器

    CREATE [OR REPLACE] TRIGGER <触发器名称>
    {BEFORE | AFTER | INSTEAD OF}
    {INSERT | DELETE | UPDATE [OF column [, column …]]}
    ON <表/视图>
    [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
    [FOR EACH ROW | STATEMENT]
    [WHEN condition]
    trigger_body;
    

    触发事件:INSERT | DELETE | UPDATE

    触发时机:BEFORE | AFTER

    触发频率:

    • ROW:行级触发;当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
    • STATEMENT:语句级触发;当某触发事件发生时,该触发器只执行一次。

    触发器的新值与旧值:

    • :new 事件触发后的新的数据行;
    • :old 事件触发前的旧的数据行;
  • 相关阅读:
    CEO良言:创业就请在29岁前做富翁
    在酒桌上看出她是哪种女人!
    巴菲特的人生财富课
    曹操的领导力:羊群变狮群(领导艺术终极体现)
    商业模式木桶短板原理与长板原理
    这三种力量,让你的人生从此大不一样……
    都市男女的30句妙语叹息
    郎咸平:诸葛亮是一名优秀的企业家吗?
    做小生意,解决生活中的问题:创业路上的成功感悟
    100个成功经验(价格不菲的培训课程笔记摘要)
  • 原文地址:https://www.cnblogs.com/liziczh/p/9353051.html
Copyright © 2011-2022 走看看