PL/SQL 学习

459 阅读4分钟

pl/sql开发、基础、进阶、高级编程

(第一天)

操纵Oracle数据库对象

  • 关系型数据库管理系统热门系统:

    • oracle
    • Microsoft
    • sql server
    • access
    • mysql
  • 关系型数据库管理系统常用功能

    • 定义数据库结构:DDL (数据定义语言来定义数据库结构)(data definition language)
    • 存取数据库内容:DML(数据操作语言实现对数据库中数据的基本存取、检索、插入、修改、删除等操作)(data manipulation language)
    • 数据库运行管理:数据控制功能,安全性,完整性和并发控制
    • 数据库建立维护:数据装入、数据库转储、恢复、重组织、监视、分析等功能
    • 数据库的传输:实现用户程序与DBMS之间的通信,通常与操作系统协调完成
  • SQL 语言:

    1. DML数据操纵语言:主要是完成数据的增、删、改和查询的操作
    2. DDL数据定义语言:主要用来创建或修改表、视图、存储过程及用户等
  • PL/SQL: (procedure language SQL)

    • 是在标准的SQL语言上添加了过程化功能的一门程序设计语言
    • 基本单元是语句块,在块中可以定义变量、常量、游标、循环结构、函数、过程、异常

2. PL/SQL 基本概念

  1. 结构化程序设计

    1. 顺序结构:自上而下依次执行
    2. 分支结构:if-then-elsif,case-when
    3. 循环结构:loop、while-loop、for-loop
  2. PL/SQL 执行的sql:

    1. 只能执行DML (数据操纵语言)

    2. 不能执行DDL(数据定义语言)

      begin
      -- 程序块中不能执行DDL 
      create table books(id int not null,bookname varchar2(100) null);
      end;
      
    3. 处理DDL 语句时使用动态SQL:execute immediate

      -- 定义SQL DDL语句
      v_sqlstr varchar2(200) := 'create table books(id int not null,bookname varchar2(100) null)' ;
      begin
      execute immediate v_sqlstr;  --  执行DDL语句
      end;
      
  3. PL/SQL块结构

    块是开发时最基本的单位,所有的PL/SQL程序都是有块组成的

    1. PL/SQL块:

      1. 匿名块:

        1. 一般用来调试服务器上的子程序,不保存在数据库中
      2. 命名块:

        1. <<块名称>> 标识的块,为了区分多级嵌套层次关系而使用命名加以区分
        2. 由函数或过程组成的子程序块,块将保存在数据库
        3. 触发器块
    2. PL/SQL块的组成:

      1. 定义部分(可选):常量、变量、游标、异常及复杂数据类型等
      2. 执行部分(必须):PL/SQL语句、SQL语句
      3. 异常处理部分(可选):用于捕捉执行部分可能出现的运行错误,并编写出错后的代码
      DECLARE -- 可选
      -- 定义部分(没有定义内容可以取消DECLARE)
      BEGIN   -- 必须
      -- 程序执行部分
      EXCEPTION -- 可选
      -- 异常处理部分
      END;     -- 必须---------- 最简单的PL/SQL 语句块 ---------------------
      begin
        -- dbms_output.put_line('这是最简单的PL/SQL语句块');
        null;   -- null 是一个可执行语句,表示什么也不做
        end;
      
  4. 变量和类型

    变量是一块用来存储数据的内存区域,定义在PL/SQL 的 DECLARE 区域,定义是需指定数据类型, 对初始值没有要求

    数据类型:

    1. 标量变量:number、varchar、varchar2、char、date等...
    2. 复合变量:使用PL/SQL 复合数据类型,PL/SQL记录、PL/SQL表等...
    3. 参照变量:用于存放指针的变量, PL/SQL 游标、对象变量
    4. LOB变量:用于存放大批量数据的变量
    --  变量定义
    DECLARE
    V_DEPTNAME VARCHAR2(10);      -- 定义标量变量
    V_LOOPCOUNTER BINARY_INTEGER; -- 定义PL/SQL 类型定义标量变量
    -- 定义记录类型
    TYPE T_EMPLOYEE IS RECORD(    
         EMPNAME VARCHAR2(10),
         EMPNO NUMBER(7),
         JOB VARCHAR2(20)
         );
    V_EMPLOYEE T_EMPLOYEE;        -- 定义记录类型变量
    TYPE CSOR IS REF CURSOR;      -- 定义游标变量
    V_DATE DATE NOT NULL DEFAULT SYSDATE; -- 定义变量并指令默认值
    BEGIN
      NULL;
    END;
    
  5. 程序控制语句

    1. 条件控制语句:IF,CASE

      -- if 语句的3中模式
      -- 1. if ...elsif ...elsif ...else 语法
      DECLARE
        V_1 NUMBER;
      BEGIN
        SELECT  floor(DBMS_RANDOM.VALUE(50,101)) INTO V_1 FROM dual ;
        IF V_1 < 60 THEN
          DBMS_OUTPUT.PUT_LINE('该分数未及格,当前分数为:' || V_1);
         ELSIF V_1 <80 THEN
           DBMS_OUTPUT.PUT_LINE('该分数已及格,当前分数为:' || V_1);
         ELSIF V_1 <90 THEN
           DBMS_OUTPUT.PUT_LINE('该分数很不错,进入三好学生评定范围,当前分数为:' || V_1);
         ELSE 
           DBMS_OUTPUT.PUT_LINE('该分数已引入年级前10,进入学生榜样评定范围,当前分数为:' || V_1);
        END IF;
      END;
      ​
      -- 2. if ...else 语法
        IF V_1 < 60 THEN
          DBMS_OUTPUT.PUT_LINE('该分数未及格,当前分数为:' || V_1);
         ELSE 
           DBMS_OUTPUT.PUT_LINE('该分数已及格,当前分数为:' || V_1);
        END IF;
      ​
      -- if 语句
      IF V_1 < 60 THEN
          DBMS_OUTPUT.PUT_LINE('该分数未及格,当前分数为:' || V_1);
        END IF;
        DBMS_OUTPUT.PUT_LINE('V_1大于等于60以上,输出V_1为:' || V_1)
        
      -----CASE 
      DECLARE
        V_1 varchar2(20) :='SYSTEM33';
      BEGIN
        CASE V_1
             WHEN 'SYS' THEN 
               DBMS_OUTPUT.PUT_LINE('The owner is SYS');
             WHEN 'SYSTEM' THEN 
               DBMS_OUTPUT.PUT_LINE('The owner is SYSTEM');
        ELSE 
          DBMS_OUTPUT.PUT_LINE('The owner is another value');
        END CASE;
      END;
      
    2. 循环语句:loop、for-loop、while-loop

\