• pl/sql编程基础


      pl/sql是一种块结构的语言,pl/sql块由三个部分组成:定义部分、执行部分和异常处理部分。定义部分用于定义常量、变量、游标、用户自定义异常等;执行部分用于实现应用模块化功能;异常处理部分用于实现应用可能出现的运行错误。pl/sql基础结构块如下:

    declare
    /*
     * 定义部分 -- 定义常量、变量、游标、用户自定义异常
     */
    begin
    /*
     * 执行部分 -- pl/sql 和SQL语句
     */
    exception
    /*
     * -- 异常处理部分 -- 处理运行异常
     */
    end; /* 块结束标记 */

    pl/sql块的类型 -- 子程序

      子程序包括过程、函数和包;使用子程序的有点在于可以简化客户端的开发和维护,并且提高了应用程序性能。

      1.过程:是用于执行特定的操作,在pl/sql中可以使用create procedure 命令建立过程。实例:

    /* 创建过程 */
    CREATE OR REPLACE PROCEDURE procedure_number() 
    IS 
    BEGIN 
           SELECT SUM(GuestNum) INTO gNum FROM RoomType JOIN          room ON roomTypeID = TYPEID WHERE TypeName = tName;
    END;/*这是一个简单查询*/

      2.函数:函数用于返回特定数据,用create function 命令建立函数。(*在函数中必须有return返回值)实例:

    CREATE OR REPLACE FUNCTION function_delect(tName VARCHAR2) 
    RETURN NUMBER
    IS       
           count_Guest NUMBER(2);-- 用来接收删除的记录条数
           rownumber NUMBER(2) := 0;
    BEGIN
           -- 删除房间信息记录
          DELETE FROM Room WHERE RoomID IN  (SELECT RoomID FROM RoomType JOIN room ON 
          TYPEID = RoomTypeid WHERE TypeName = tName);
          rownumber := rownumber + sql%rowcount; -- 返回删除的记录数
           -- 提交数据 
          RETURN rownumber;
          COMMIT;  
          /* 异常处理 */
          EXCEPTION 
                 WHEN OTHERS THEN
                      ROLLBACK;-- 回滚  
                      DBMS_OUTPUT.PUT_LINE(SQLERRM);
                      RETURN -1;
    END;

    用函数在上面的代码中,是你简单删除操作,声明了一些变量,提交和异常处理。

    3.包:包用于逻辑组合相关的过程和函数,它由包规范和包体组成的。包规范就像java中的接口一样,定义过程和函数,在包体中必须实现包规范中的所有过程和函数。用create package 命令。

    /* 定义包规范 */
    CREATE OR REPLACE PACKAGE pkg_gues IS
           FUNCTION fun_room(tName VARCHAR2) RETURN NUMBER;--  a. 统计某类型客房的入住客人人数的函数
           PROCEDURE proc_RoomType;-- c. 统计各类型客房数量的过程
    END pkg_gues;

    在包规范中,值包含了过程和函数的说明。具体实现是包体中体现的。包体使用CREATE PACKAGE BODY命令。实例

    /* 包体:实现 */
    CREATE OR REPLACE PACKAGE BODY pkg_gues IS
    /*函数*/
           FUNCTION fun_room(tName VARCHAR2) RETURN NUMBER IS
                           amount NUMBER(3);
                  BEGIN 
                           SELECT SUM(GuestNum) INTO amount FROM Room WHERE DESCRIPTION = tName;
                           RETURN amount;
                  END;
    /*过程*/
           PROCEDURE proc_RoomType IS     
                           /*保存各房间类型有多少房间*/
                           TYPE count_type_table IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;  
                           count_type count_type_table;
                           /*保存已有人入住的房间类型*/
                            TYPE count_table_type IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER; 
                            count_table count_table_type;
                  BEGIN
                           SELECT DESCRIPTION,COUNT(*) BULK COLLECT INTO count_table,count_type FROM room 
                           GROUP BY DESCRIPTION;
                           FOR i IN 1 .. count_type.count LOOP
                                  dbms_output.put_line('房间类型:'|| count_table(i) ||'房间数:' || count_type(i));
                           END LOOP;       
                  END;
           
    END pkg_gues;

    在包体和包规范中用到的OR REPLACE 作用是在每次运行的时候将以前运行后生成的替换。

    
    
    
  • 相关阅读:
    Linux systemd & init.d
    windows 气泡提示
    C++17新特性
    Lua & C++
    C++智能指针原理
    C++ Memory Order
    析命令提示符的原理
    设置与获取系统代理信息
    命令查看系统信息
    Linux shell脚本
  • 原文地址:https://www.cnblogs.com/gzyfj/p/4593376.html
Copyright © 2020-2023  润新知