zoukankan      html  css  js  c++  java
  • 使用plsql编程

    第七章  使用PL/SQL编程

    初识PL/SQL(Procedure Language & Structured Query Language)

    PL/SQL是Oracle在标准SQL语言上的过程性扩展,允许嵌入SQL语句,定义变量和常量允许过程语言结构(条件分支语句和循环语句)允许使用异常来处理Oracle错误 可以用于创建存储过程、触发器和程序包等,也可以用于处理业务  规则、数据库事件或给SQL命令的执行添加程序逻辑

    普通SQL语言只能实现访问,操作数据;

    PL/SQL可以实现流程控制,异常处理,创建可存储的代码块;

     

    PL/SQL块

    所有的PL/SQL程序都以块作为基本单位

    块中包含过程化语句和SQL的DML语句。这些块可以按顺序出现,也可以相互嵌套(一个块在另一个块的内部)

    块的分类

    1. 无名块或匿名块(anonymous):动态构造,只能执行一次,可调用其它程序,但不能被其它程序调用。

    2. 命名块(named):是带有名称的匿名块,这个名称就是标签。

    3. 子程序(subprogram):存储在数据库中的存储过程、函数等。当在数据库上建立好后可以在其它程序中调用它们。

    4. 触发器(Trigger):当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。

    5. 程序包/包(package):存储在数据库中的一组子程序、变量定义。在包中的子程序可以被其它程序包或子程序调用。但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序。

     

    PL/SQL块的结构

    示例1:

    DECLARE

      V_NAME varchar2(20)  := '郭老师';

    BEGIN

      DBMS_OUTPUT.put_line(V_NAME||'的第一条PL/SQL语句');

    END;

     

    与用户交互输入参数

    declare

      v_name  varchar2(20):= '&input_name';

    begin

      dbms_output.put_line(v_name||'的第一条PL/SQL语句');

    end;

     

    示例2:

    DECLARE

        v_name1 varchar2(32);

        v_name2 varchar2(32) := 'ABC';

        v_num1 number := 13;

        v_num2 number;

    BEGIN

         dbms_output.put_line(v_name1);

         dbms_output.put_line(v_name1 || v_name2);

         dbms_output.put_line(v_num1);

         dbms_output.put_line(v_num1 + v_num2);

    END;

    注意:

           1. 声明变量时,必须要指定类型

           2. 变量名需要先赋值,后使用

           3. 变量名没有默认值(表现是空,无意义)

     

     

    示例3:

    CONSTANT 定义常量值,定义后无法修改

    DECLARE 

      v_number1 number  := 13;

      v_number2 CONSTANT number := 3.14;

    BEGIN

      DBMS_OUTPUT.put_line(v_number1 * v_number2);

    END;

     

    示例4:

    变量与指定的列的类型一致 采用%TYPE

    DECLARE 

      v_num1 employees.salary%type  := 13.234;

      v_num2 employees.manager_id%type := 2;

    BEGIN

      DBMS_OUTPUT.put_line(v_num1 / v_num2);

    END;

     

    示例5:

    DML结果装载入PLSQL变量

    declare

      v_salary employees.salary%type;

    begin

      select salary into v_salary from employees where employee_id=198;

      DBMS_OUTPUT.put_line('v_salary:'||v_salary);

    end;

     

    示例6:

    %ROWTYPE表示数据类型是一行数据

    DECLARE

      v_emp employees%rowtype;

    BEGIN

      select * into v_emp from employees where employee_id = 100;

      dbms_output.put_line('部门编号:'||v_emp.department_id ||

                           ' 员工姓名:'|| v_emp.first_name);

    END;

     

    insert操作,接收返回值

    示例6:

     

    返回值拼接

     

    update操作,接收返回值

    示例7:

     

    delete操作,接收返回值

    示例8:

     

    数组类型

     

    题:通过用户输入的员工号,查询一行记录

     

    异常处理

     

     

    异常名称

    异常编码

    异常解释

    TIMEOUT_ON_RESOURCE

    ORA-0051

    发生超时

    TOO_MANY_ROWS

    ORA-1422

    SELECT INTO命令返回的多行

    TRANSACTION_BACKED_OUT

    ORA-006

    由于死锁提交被退回

    VALUE_ERROR

    ORA-6502

    转换或者裁剪错误

    ZERO_DIVIDE

    ORA-1476

    试图被零除

    LOGIN_DENIED

    ORA-1017

    无效的用户名或者口令

    NO_DATA_FOUND

    ORA-1403

    查询未找到数据

    NOT_LOGGED_ON

    ORA-1012

    还未连接就试图数据库操作

    PROGRAM_ERROR

    ORA-6501

    内部错误

    ROWTYPE_MISMATCH

    ORA-6504

    主变量和光标的类型不兼容

    STORAGE_ERROR

    ORA-6500

    内部错误

    ACCESS_INTO_NULL

    ORA-6530

    试图访问一个未初始化的对象时出现

    CASE_NOT_FOUND

    ORA-6592

    CASE语句中的选项与用户输入数据不匹配时出现

    CURSOR_ALREADY_OPEN

    ORA-6511

    试图打开一个已打开的光标

    DUP_VAL_ON_INDEX

    ORA-0001

    试图破坏一个唯一性限制

    INVALID_CURSOR

    ORA-1001

    试图使用一个无效的光标

    INVALID_NUMBER

    ORA-1722

    试图对非数字值进行数字操作

     

     

    流程控制

    if

    IF <布尔表达式> THEN
      PL/SQL 和 SQL语句
    ELSE
      其它语句
    END IF;

     

    case

    CASE 条件表达式
    WHEN 条件表达式结果1 THEN
         语句段1
    WHEN 条件表达式结果2 THEN
         语句段2
      ......
    WHEN 条件表达式结果n THEN
         语句段n
    [ELSE 条件表达式结果]
    END;

     

    loop 三种循环方法

    LOOP
          要执行的语句;
    EXIT WHEN <条件语句>; --条件满足,退出循环语句
    END LOOP;

     

    while

    WHILE <布尔表达式> LOOP
        要执行的语句;
    END LOOP;

     

    for 推荐

    FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP
      要执行的语句;
    END LOOP ;

     

    IN 每次循环加一;

    IN REVERSE 每次循环减一;

    EXIT 退出循环;

     

     

     

    数组的输出采用for循环方式,打印出来

     

     

     

  • 相关阅读:
    kinect 2(ubuntu16.04)
    编译、执行错误合辑
    Qt5学习笔记(基础)
    内核格式化(C++)
    (3)视觉里程计 Visual Odometry
    字符串搜索 find()
    (2)特征点匹配,并求旋转矩阵R和位移向量t
    27. Remove Element
    快看漫画面试经历
    面试题40:最小的 k 个数
  • 原文地址:https://www.cnblogs.com/h-w-b/p/12463043.html
Copyright © 2011-2022 走看看