zoukankan      html  css  js  c++  java
  • 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包:用于文本文件的输入与输出

  • 相关阅读:
    hdu 3951 Coin Game
    hdu 1273 漫步森林
    hdu 2082 找单词
    kmp算法(模板)
    CodeForces 742B Arpa’s obvious problem and Mehrdad’s terrible solution
    大二上每日总结
    大二上每日总结
    大二上每日总结
    大二上学期周总结
    大二上每日总结
  • 原文地址:https://www.cnblogs.com/SLKnate/p/oracle11g_plsql.html
Copyright © 2011-2022 走看看