PL/SQL语法--PL/SQL和SQL的异同

引言

        在Oracle数据库开发与管理中,SQL与PL/SQL作为两种不可或缺的语言工具,时常引发开发者们的好奇与探究。SQL作为结构化查询语言,无疑是全球数据库从业者必备的基础技能,用于处理数据的增删改查和基本的数据操纵。然而,PL/SQL的内涵则更为丰富,它是Oracle数据库独有的过程化SQL扩展,赋予了SQL更多的程序化处理能力和逻辑控制结构

        随着项目的复杂度逐渐提升,简单的SQL语句已不足以满足某些高级业务逻辑的需求。此时,PL/SQL的价值便凸显出来——它允许开发人员编写存储过程、触发器和其他复杂的数据库对象,从而实现更高效、更具可重用性的数据库应用程序。

        在此背景下,深入理解SQL与PL/SQL之间的联系与差异,成为了广大开发者提升技术水平、优化数据库应用性能的关键环节。通过对比它们的语法结构、执行方式、适用场景和功能特性,我们可以更精准地把握何时选用SQL进行基本查询操作,何时借助PL/SQL的强大功能来处理复杂的数据库任务。

        本文将以通俗易懂的方式,带领大家一同探讨SQL与PL/SQL的核心概念、功能特点以及实际应用场景下的异同点,让您在实践中更好地权衡和运用这两种语言,从而在数据库开发之路上越走越远。

        更多PL/SQL语法与案例解析请查看专栏


一、核心概念

1、SQL释义:

  • SQL 全称是(Structured Query Language),是一种结构化查询语言,包括数据查询(Data Retrieval)、数据定义(Data Definition)、数据操作(Data Manipulation)、关系操作(Relational Operations)、数据聚合(Data Aggregation)、数据控制(Data Control)。

    • 数据查询(Data Retrieval):SQL最核心的功能是查询数据。通过SELECT语句从数据库表中检索特定数据。例如,从一个员工表中选取所有员工的姓名和工资:

      -- 查询员工姓名、薪水
      SELECT Name, Salary FROM Employees;
      
    • 数据定义(Data Definition):SQL允许创建、修改和删除数据库对象,如表、视图、索引、存储过程等。创建一个表的示例:

      -- 新建员工表
      CREATE TABLE Employees (
          EmployeeID INT PRIMARY KEY,
          Name VARCHAR(50),
          JobTitle VARCHAR(50),
          HireDate DATE
      );
      
    • 数据操作(Data Manipulation): SQL提供INSERT、UPDATE和DELETE语句用于插入、更新和删除数据记录。例如,插入一条员工记录:

      INSERT INTO Employees (Employee_ID, Name, Work, Hire_Date)
      VALUES (1, 'John Doe', 'Manager', '2022-01-01');
      
    • 关系操作(Relational Operations): SQL支持表间关系的处理,包括JOIN操作(内连接、外连接等),以及嵌套查询(Subqueries)。例如,联接员工表和部门表以获取员工与其所在部门的信息:

      -- 关联查询员工姓名和部门名称
      SELECT E.Name, D.DepartmentName 
        FROM Employees E
      LEFT JOIN Departments D 
      	ON E.DepartmentID = D.DepartmentID;
      
    • 数据聚合(Data Aggregation): SQL支持对数据进行统计和聚合操作,如COUNT(计数)、SUM(求和)、AVG(平均值)、MAX(最大值)和MIN(最小值)。例如,统计员工表中的总人数:

      -- 查询员工合计薪水
      SELECT SUM(SALARY) FROM  Employees;
      
    • 数据控制(Data Control) :SQL还涉及权限管理和事务控制,包括使用GRANT、REVOKE语句设置用户的访问权限,以及通过COMMIT、ROLLBACK进行事务处理,确保数据的一致性和完整性。例如:

      -- 授权用户 accenture 对 Employees 表的有查询和插入的权限(在另一用户下授权)
      GRANT SELECT, INSERT ON Employees TO accenture;
      
      -- 撤销之前赋予 accenture  对 Employees 表的插入权限
      REVOKE INSERT ON Employees FROM accenture ;
      
      -- 对更新语句提交事务
      BEGIN TRANSACTION;
      	UPDATE Employees SET Salary = Salary * 1.1 WHERE DepartmentID = 10;
      COMMIT;
      
  • SQL的核心功能主要是围绕着对数据库中的数据进行查询、定义、操作、关系处理、聚合计算以及权限控制等方面展开,为用户提供了对数据库进行全方位管理的能力。

2、PL/SQL释义:

  • PL/SQL 全称是(Procedural Language extensions to SQL),是Oracle 为SQL语言提供的一种过程性编程语言扩展。它可以让开发者编写复杂的编程逻辑,这在纯SQL语言中是无法实现的。以下是对PL/SQL的详细描述:

    • 过程性语言:PL/SQL是一种过程性语言,这意味着它包含了控制结构,如循环(LOOP)、条件语句(IF-THEN-ELSE)、错误处理(EXCEPTION)等,这使得开发者可以编写复杂的业务逻辑。例如:你可以使用条件语句和循环语句来控制程序的执行流程

      -- 经典语法,BEGIN END语法
       BEGIN
         DECLARE x NUMBER := 1;											-- 声明,其中 := 是赋值
         BEGIN	
            IF x = 1 THEN													-- 判断条件
               DBMS_OUTPUT.PUT_LINE('x 是 1');
            ELSE
               DBMS_OUTPUT.PUT_LINE('x 不是 1');							-- 输出语句
            END IF;
         END;
      END;
      
    • SQL的扩展:PL/SQL是SQL的扩展,它允许开发者在程序中直接嵌入SQL语句,如SELECT、INSERT、UPDATE、DELETE等,这使得数据操作更为方便。

      -- 在PL/SQL 块里嵌入SQL语句,下面的是Select查询语句
      BEGIN
         DECLARE x NUMBER;
         BEGIN
            SELECT COUNT(*) INTO x FROM employees;
            DBMS_OUTPUT.PUT_LINE('有 ' || x || ' 个员工。');				-- || 是拼接符,与CONCAT()函数功能一致
         END;
      END;
      
    • 块结构:PL/SQL的代码是以块的形式组织的,一个块可以包含一段或多段可执行的代码。块结构使得代码更易于理解和维护。

      -- 删除员工表数据,并提交事务。 以Begin ... End 块包裹
      BEGIN
         DELETE FROM employees;
         COMMIT;
      END;
      
    • 异常处理:PL/SQL提供了强大的异常处理机制,开发者可以定义并处理各种异常,这有助于提高程序的健壮性。

      --  PL/SQL 异常处理,类似于Java中的Try...Catch 捕获异常功能
      BEGIN			-- CSDN-小小野猪
         DECLARE															-- 声明关键词: DECLARE
            x NUMBER := 1;
            y NUMBER := 0;
            z NUMBER;
         BEGIN
            BEGIN
               z := x / y;
            EXCEPTION
               WHEN ZERO_DIVIDE THEN
                  DBMS_OUTPUT.PUT_LINE('有异常:0不可作为除数');
            END;
         END;
      END;
      
    • 存储过程和函数:PL/SQL允许开发者编写存储过程和函数,这些过程和函数可以被存储在数据库中,供其他程序或触发器调用。存储过程入门可参考
                   1、Oracle存储过程入门教程(通俗理解存储过程),有详细介绍。
                   2、118个真实应用场景的Oracle存储过程案例及开发指南(从入门到熟练使用)资源。

      -- 声明存储过程:
      CREATE OR REPLACE PROCEDURE greet(name IN VARCHAR2) AS				-- IN是入参
      BEGIN
         DBMS_OUTPUT.PUT_LINE('你好, ' || name);
      END;
      
    • 游标管理:PL/SQL提供了光标管理的功能,开发者可以使用光标来处理SQL查询返回的结果集。

      -- 使用游标关键词CURSOR 开启游标  CSDN-小小野猪
      DECLARE 
         CURSOR c IS SELECT * FROM employees;					-- c标识游标的名称,整个查询语句作为游标 c 的数据源
         r c%ROWTYPE;											-- %ROWTYPE 类型,r 变量的结构将与游标查询结果的每一行数据结构完全匹配。
      BEGIN
         OPEN c;												-- 打开游标
         LOOP													-- 循环处理
            FETCH c INTO r;
            EXIT WHEN c%NOTFOUND;					-- 当游标无法获取新行时退出循环
            DBMS_OUTPUT.PUT_LINE('员工姓名:: ' || r.first_name || ' ' || r.last_name);
         END LOOP;
         CLOSE c;												-- 关闭游标
      END;
      
  • PL/SQL是一种强大的数据库编程语言,它结合了SQL数据查询和处理的能力与过程化编程语言的特点,如变量、条件控制(if-then-else、case等)、循环(for loop、end loop等)、异常处理等,为数据库编程提供了更高的抽象级别和更强的灵活性。

二、功能特点以及实际应用场景

1、异同点

  • :PL/SQL是Oracle数据库专门支持的一种过程化编程语言,它在SQL的基础上进行了扩展,引入了诸如变量、常量、控制结构(如循环、条件语句、异常处理)、自定义函数和存储过程等编程元素。而SQL(Structured Query Language)则是用于管理和处理关系型数据库的标准语言,主要用于查询、插入、更新和删除数据。

  • :两者都用于与数据库交互,都包含对数据操作的基本命令(如SELECT、INSERT、UPDATE、DELETE等)。但在PL/SQL中,你可以把这些SQL命令封装在过程、函数、触发器等程序结构中。

2、实际应用场景举例:

  • 存储过程:创建一个存储过程用于批量处理员工薪资调整,包含【多个逻辑操作】,如计算新薪资、更新数据库记录、记录审计日志等。在一个事务中完成整个操作,确保原子性和一致性。

    -- 创建存储过程,包含多个处理逻辑
    CREATE OR REPLACE PROCEDURE adjust_salaries(p_department_id NUMBER, p_percentage_increase NUMBER) IS
      CURSOR emp_cur IS SELECT * FROM Employees WHERE DepartmentID = p_department_id;
      v_employee_record emp_cur%ROWTYPE;
    BEGIN
      FOR v_employee_record IN emp_cur LOOP
      	-- 薪水调整(操作一)  CSDN-小小野猪
        v_employee_record.Salary := v_employee_record.Salary * (1 + p_percentage_increase / 100);    
        -- 更新薪水(操作二)  CSDN-小小野猪
        UPDATE Employees SET Salary = v_employee_record.Salary WHERE EmployeeID = v_employee_record.EmployeeID;
      END LOOP;
      COMMIT;
    EXCEPTION
      WHEN OTHERS THEN						-- 异常捕获
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE('An error occurred while adjusting salaries: ' || SQLERRM);
    END;
    
  • 定义一个触发器,在插入新员工记录时自动为其分配唯一的员工编号。

    -- 定义触发器 CSDN-小小野猪
    CREATE OR REPLACE TRIGGER assign_employee_id
    BEFORE INSERT ON Employees				-- 触发器触发时机是插入员工操作之前
    FOR EACH ROW
    BEGIN
      SELECT MAX(EmployeeID) + 1 INTO :NEW.EmployeeID FROM Employees;
    END;
    
  • 编写一个自定义函数,用于解决中文排序问题。

    -- 自定义中文映射阿拉伯数字函数  CSDN-小小野猪
    CREATE OR REPLACE FUNCTION P_ORDER_CHINESE_TO_ARABIC(V_NUM VARCHAR2)
    RETURN NUMBER
    IS
    BEGIN
      -- 根据不同的中文数字,映射到对应的阿拉伯数字
      CASE V_NUM
        WHEN '一' THEN RETURN 1;
        WHEN '二' THEN RETURN 2;
        WHEN '三' THEN RETURN 3;
        WHEN '四' THEN RETURN 4;
        WHEN '五' THEN RETURN 5;
        WHEN '六' THEN RETURN 6;
        WHEN '七' THEN RETURN 7;
        WHEN '八' THEN RETURN 8;
        WHEN '九' THEN RETURN 9;
        WHEN '十' THEN RETURN 10;
    	
        -- ... 其他数字可继续添加
      END CASE;
    END;
    

三、性能与效率对比

  • Oracle数据库有声明:只要是对数据的操作可以使用存储过程执行,速度比其他语言获取数据再加工要快。

  • 讨论在特定情况下,使用PL/SQL相较于单纯SQL有优势,例如批量处理数据、减少网络通信开销等。但在单个处理逻辑时应该选用SQL,根据合适的场景选择合适的语法以提高性能和资源利用率。

四、总结

  • SQL语句通常由客户端发送到数据库服务器执行,每次执行都是针对单个请求响应。而PL/SQL程序可以在数据库服务器端预编译并存储,随后由服务器端调用执行,特别适用于批量处理和复杂逻辑操作。
  • 在执行效率上,PL/SQL可以减少网络传输次数,因为可以将多个SQL语句组合在一个存储过程或函数中一次性执行,从而提高性能。
  • SQL主要用于简单的数据查询和修改,而PL/SQL则支持复杂的编程逻辑,例如可以编写循环来处理一组记录,或者使用条件判断语句来根据不同情况执行不同的操作。
  • PL/SQL可以将相关的函数和过程封装起来,实现代码的复用和模块化,而SQL不支持这种级别的封装。
  • SQL作为一种标准化的语言,可以在多种支持SQL的数据库系统中使用。然而,PL/SQL是Oracle数据库专有的,不能直接在其他数据库系统(如MySQL、SQL Server等)中使用。
  • 在哪些情况下更适合使用SQL?哪些情况下应使用PL/SQL?这是经常困扰开发者的问题,这时需要根据具体业务需求、性能要求以及团队的技术栈等因素综合考虑。

五、其他

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,严谨转载。不得擅自复制、发布、传播、改编或以其他任何形式使用本文内容。

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小野猪

若恰好解决你的问题,望打赏哦。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值