• Oracle11g R2学习系列 之九 PL/SQL语言


    这是个重头戏,如果精通了PL/SQL,毫不夸张的说明精通了Oracle了。PL/SQL由以下三个部分组成(Definition,Manipulation,Control)

    DDL:数据定义语言,Create,Alter,Drop等用于执行数据库的任务。

    DML:数据操作语言,Select,Insert,Update,Delete等用于操纵数据库中各种对象、检索和修改数据。

    DCL:数据控制语言,Grant,Remove等用于安全管理、确定哪些用户可以查看或修改数据库中数据。

    PL/SQL的运算符有跟其他语言相似,也有数学运算符(+-*/等)和逻辑运算符(and,or,not),及其电他如赋值符:=,字符串分隔符' 及并置运算符||(这个要留意,ms sql中用的是+,C#及好多其它语言都是+).

    变量:数据库与PL/SQL程序之间是通过变量进行数据传递的。基本格式

    <变量名><数据类型>[(宽度):=<初始值>];
    
    例如,定义一个长度为10的变量count,其初始值为1,是varchar2类型。
    count varchar2(10) := '1';
    View Code

    关于数据类型,PL/SQL支持用户自定义类型。如自定义表类型,记录类型,输入下面的代码会输出abc字样出来。

    set serveroutput on    
    declare
      type t_xs is record
      (    
        xh char(6),
        xm char(8),
        xb char(2),
        zy char(12)
      );
      myxs t_xs;
    begin
      myxs.xh:='abc';
      dbms_output.put_line(myxs.xh);
    end;
    View Code

    为了美观和易于读写,以后关键字都大写好了。

    如果要申明一个变量,其类型与表中的某列值相同,可以使用%Type属性,即语法是这样子的:

    <变量名> 表名.列名%Type;
    
    声明一个变量my_xh与表XSB中的XH列具有相同的数据类型,就可以这样子定义:
    my_xh XSB.XH%TYPE;
    View Code

    而用于描述表的行数据的记录的时候,可以使用%RowType属性。一般用于游标,表示一行记录。如下所示利用游标查询出cjb中的所有cj值。记录一行数据的时候,用的就是%RowType属性。

    Set ServerOutput On
    Declare
        Cursor cur
        Is
        Select xh,kch,cj From cjb;
    cur_rec cur%RowType;
    Begin
      Open cur;
      if cur%IsOpen then
        loop
          Fetch cur into cur_rec;
            if cur%found then
              Dbms_Output.put_line(cur_rec.cj);
            else
              exit;
            end if;
        end loop;
      else
        Dbms_Output.put_line('Cursoe is closed.');
      end if;
      Close cur;
    End;
    View Code

     常量:程序运行过程中值不变的量。其语法格式:

    <常量名>constant<数据类型>:=<>

     PL/SQL块的基本结构如下所示:

    [ DECLARE ]
    
        --声明部分
    
    BEGIN
    
        --执行部分
    
    [EXCEPTION]
    
        --异常处理部分
    
    END
    View Code

    PL/SQL程序的结构跟其它语言大体相同,也有条件,循环,有case 语句,也有Goto语句。整个跟C#差不多,所以,不多列举,相信真要用的时候,自然而会条件反射出if...then...elseif...then...else,或者loop...exit...end loop等。我大概翻看了一下ppt教程,发现循环结构有以下4种:

    1.LOOP-EXIT-END循环
    语法格式:
    LOOP
        Run_expression                  /*执行循环体*/
        IF Boolean_expression THEN   /*测试Boolean_expression是否符合退出条件*/
            EXIT;                      /*满足退出条件,退出循环*/
        END IF;
    END LOOP;
    
    2.LOOP-EXIT-WHEN-END循环
    除退出条件检测有所区别外,此结构与前一个循环结构类似。
    语法格式:
    LOOP
        Run_expression                             /*执行循环体*/
        EXIT WHEN Boolean_expression             /*测试是否符合退出条件*/
    END LOOP;
    
    3WHILE-LOOP-END循环
    语法格式:
    WHILE Boolean_expression          /*测试Boolean_expression是否符合退出条件*/
        LOOP
            Run_expression       /*执行循环体*/
        END LOOP;
    
    4FOR-IN-LOOP-END循环
    语法格式:
    FOR count IN count_1..count_n               /*定义跟踪循环的变量*/
        LOOP
            Run_expression                  /*执行循环体*/
        END LOOP;
    View Code

    系统内置函数及自定义函数,内置属于API内容,是语言都会有。没什么稀奇,而且一般也差不多。自定义函数就是说使用如下的语法格式创建函数:

    CREATE [OR REPLACE] FUNCTION function_name       /*函数名称*/
    (    
        parameter_name1, mode1 datatype1,         /*参数定义部分*/
        parameter_name2, mode2 datatype2,
        parameter_name3, mode3 datatype3,
        …
    )
        RETURN return_datatype                                 /*定义返回值类型*/
        {IS | AS}
        [声明变量]
        BEGIN
            function_body;                          /*函数体部分*/
            [RETURN scalar_expression;]                     /*返回语句*/
        END [function_name];
    View Code

    包,在定义使用SELECT命令来查询数据库表数据时,一定要使用包头,否则无法实现存储过程的定义。Oracle提供了若干具有特殊功能的内置包。这些具有特殊功能的包如下。

    (1)DBMS_ALERT包:用于数据库报警,允许会话间通信。

    (2)DBMS_JOB包:用于任务调度服务。

    (3)DBMS_LOB包:用于大型对象操作。

    (4)DBMS_PIPE包:用于数据库管道,允许会话间通信。

    (5)DBMS_SQL包:用于执行动态SQL。

    (6)UTL_FILE包:用于文本文件的输入与输出

  • 相关阅读:
    监控里的主码流和子码流是什么意思
    监控硬盘容量计算
    一个能让你了解所有函数调用顺序的Android库
    电工选线
    oracle linux dtrace
    list all of the Oracle 12c hidden undocumented parameters
    Oracle Extended Tracing
    window 驱动开发
    win7 x64 dtrace
    How to Use Dtrace Tracing Ruby Executing
  • 原文地址:https://www.cnblogs.com/SLKnate/p/oracle11g_plsql.html
Copyright © 2020-2023  润新知